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

时间:2013-07-26 16:39:06

标签: 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')

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

喜欢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}

1 个答案:

答案 0 :(得分:5)

来自fine manual

  

groupBy _.groupBy(list, iterator, [context])

     

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

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

_(a).groupBy(function(o) {
    return o.event_title + '\x00' + o.other_key;
});

我猜测'\x00'不会显示在event_title中,但您可以使用任何分隔符来处理您的数据。

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