使用下划线groupby按多个属性对对象数组进行分组

1 javascript backbone.js underscore.js

我想通过包含在其中的对象的两个属性来分组我的JavaScript对象数组.

我试过下划线groupBy,它似乎一次只接受一个属性.

_.groupBy([{'event_date':'2013-10-11', 'event_title':'Event 2'}, {'event_date':'2013-01-11', 'event_title':'Event 1'}], 'event_title')
Run Code Online (Sandbox Code Playgroud)

我的问题是......有没有办法按两个属性对一组对象进行分组.

就像Ruby一样

[#<struct Event event_date=2013-10-11, event_title=Event 2>, #<struct Event  event_date=2013-01-11, event_title=Event 1>].group_by{|p| p.event_date and p.event_title}
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 5

精细手册:

通过...分组 _.groupBy(list, iterator, [context])

将集合拆分为集合,按照通过迭代器运行每个值的结果进行分组.如果迭代器是字符串而不是函数,则按每个值上的迭代器命名的属性进行分组.

因此,您可以传递一个函数,_.groupBy结果将按该函数的结果进行分组.这只意味着您需要一个能够为您的组生成简单键的函数.不幸的是,JavaScript中的对象键是字符串,所以你不能(可靠地)使用一个返回像你在Ruby中那样的键数组的函数,但你可以稍微改变一下:

_(a).groupBy(function(o) {
    return o.event_title + '\x00' + o.other_key;
});
Run Code Online (Sandbox Code Playgroud)

我猜'\x00'你的内容不会出现,event_title但你可以使用任何分隔符来处理数据.

演示:http://jsfiddle.net/ambiguous/hwg3p/