示例集合(仅显示模型):
[
{
name: "Bob"
date: "Thu Mar 29 2012"
},
{
name: "James"
date: "Fri Mar 30 2012"
},
{
name: "Dylan"
date: "Fri Mar 30 2012"
},
{
name: "Stanley"
date: "Sat Mar 31 2012"
},
]
如何使用Underscore.js的groupBy函数对具有相同日期的模型进行分组?
答案 0 :(得分:47)
如果要对实际主干集合进行分组,则可以使用主干方法groupBy,它隐式使用下划线_.groupBy功能。在我看来,这是一种更清洁的方法。
collection.groupBy( function(model){
return model.get('date');
});
答案 1 :(得分:10)
ThiefMaster的答案是完全有效的,但它引起了一些困惑,因为我正在搜索标题所示的backbone.js集合的解决方案。
如果问题对象是主干集合,我们应该按照日期对模型进行分组:
_.groupBy(collection.models, function(model){
return model.get('date')
});
我希望它有所帮助
答案 2 :(得分:5)
使用_.groupBy(data, 'date');
您也可以使用传递自定义函数,但在这种情况下,没有必要,因为上面的属性快捷语法工作正常。
_.groupBy(data, function(row) {
return row.date;
});
<强>演示:强>
> _.groupBy(data, 'date')
{ 'Thu Mar 29 2012': [ { name: 'Bob', date: 'Thu Mar 29 2012' } ],
'Fri Mar 30 2012':
[ { name: 'James', date: 'Fri Mar 30 2012' },
{ name: 'Dylan', date: 'Fri Mar 30 2012' } ],
'Sat Mar 31 2012': [ { name: 'Stanley', date: 'Sat Mar 31 2012' } ] }
> _.groupBy(data, function(row) { return row.date });
{ 'Thu Mar 29 2012': [ { name: 'Bob', date: 'Thu Mar 29 2012' } ],
'Fri Mar 30 2012':
[ { name: 'James', date: 'Fri Mar 30 2012' },
{ name: 'Dylan', date: 'Fri Mar 30 2012' } ],
'Sat Mar 31 2012': [ { name: 'Stanley', date: 'Sat Mar 31 2012' } ] }
>
答案 3 :(得分:4)
var groups =collection.groupBy(function(model) { return model.get('date'); });
//iterate over groups
for(date in groups) {
var models = groups[date];
console.log('date: '+date);
for (var model_idx in models) {
console.log(' name: '+ models[model_idx].get('name'));
}
}
答案 4 :(得分:0)
对于那些使用Lodash而不是下划线的人,您可以使用_.method()
访问者获得相同的结果,
collection.groupBy(_.method('get', 'date'));