Backbone.Model/Collectionのメソッドとして利用できるUnderscore.jsのメソッド

sortBy,map,pluck,filter,groupBy,pick.omitとか使える。いくつか試してみた。

backbone.js v1.0.0

function l(s) {console.log(s)};
function a(s) {alert(s)};
l('Underscore in Backbone.Collection');

var coll = new Backbone.Collection();
coll.add([
    {id: 0, name: 'taro', age: 20, sex: 'male'}
    ,{id: 1, name: 'jiro', age: 10, sex: 'male'}
    ,{id: 2, name: 'hanako', age: 11, sex: 'female'}
    ,{id: 3, name: 'kayo', age: 21, sex: 'female'}
]);

coll.forEach(function(model){
    l(JSON.stringify(model));
});

var sorted = coll.sortBy(function(model){
    return model.get('age');
});
var mapped = new Backbone.Collection(sorted).map(function(model){
    return {id: model.get('id'), name: model.get('name') + ',yamada', sex: model.get('sex')};
});

var plucked = new Backbone.Collection(mapped).pluck('name');
//ageの昇順になってnameにyamadaが追加されてnameだけが抜き出されている
l(JSON.stringify(plucked));

var grouped = new Backbone.Collection(mapped).groupBy('sex');
l(JSON.stringify(grouped.male));

//いちいちnew Backbone.Collection(array)は面倒なのでchainする
l(
    coll.chain()
    .filter(function(model){return model.get('age') <= 20;})
    .sortBy(function(model){return model.get('age')})
    .map(function(model){
        return {id: model.get('id'), name: model.get('name') + ',yamada', sex: model.get('sex')}
    })
    .pluck('name')
    .value()
);//groupByは特殊でできなかった

l('Underscore in Backbone.Model');

l(coll.get(0).pick(['name','age', 'sex']));
l(coll.get(0).omit(['id','sex']));