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

Mar*_*yen 8 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"
    },
]
Run Code Online (Sandbox Code Playgroud)

如何使用Underscore.js的groupBy函数对具有相同日期的模型进行分组?

bul*_*rog 47

如果要对实际主干集合进行分组,则可以使用主干方法groupBy,它隐式使用下划线_.groupBy功能.在我看来,这是一种更清洁的方法.

collection.groupBy( function(model){
  return model.get('date');
});
Run Code Online (Sandbox Code Playgroud)

  • 你甚至可以用速记:collection.groupBy('date') (8认同)
  • 这是对所问问题的实际答案。 (2认同)

RaT*_*TiO 10

ThiefMaster的答案是完全有效的,但它引起了我一些困惑,因为我正在搜索标题所示的backbone.js集合的解决方案.

如果问题对象是主干集合,我们应该按照日期对模型进行分组:

_.groupBy(collection.models, function(model){
    return model.get('date')
});
Run Code Online (Sandbox Code Playgroud)

我希望它有所帮助


Thi*_*ter 5

使用 _.groupBy(data, 'date');

您也可以使用传递自定义函数,但在这种情况下,没有必要,因为上面的属性快捷语法工作正常.

_.groupBy(data, function(row) {
    return row.date;
});
Run Code Online (Sandbox Code Playgroud)

演示:

> _.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' } ] }
>
Run Code Online (Sandbox Code Playgroud)

  • 这对于实际的主干集合不起作用,牛蛙的答案是正确的. (3认同)
  • 有没有办法为每个组设置视图,并在一个模型从一个组移动到另一个组时保持自动同步这些视图?例如,如果我更改模型上的日期,则应将其移动到另一个组,并且视图必须相应地更新.任何方式半自动(也许使用木偶)或我必须手动执行此操作? (2认同)