如何在Backbone.js中使用groupBy对集合进行分组?

时间:2012-03-31 09:14:21

标签: javascript backbone.js underscore.js

示例集合(仅显示模型):

[
    {
        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函数对具有相同日期的模型进行分组?

5 个答案:

答案 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'));