Underscore.js - 具有嵌套数组的groupBy

时间:2014-10-03 08:49:02

标签: underscore.js lodash

我正在努力将我的类别数组分组到一个像这个例子的集合中:

 var programs = [
   {
    name: 'a',
    categories: ['cat1', 'cat2']
   },
   {
    name: 'b',
    categories: ['cat2']
   },
   {
    name: 'c',
    categories: ['cat1', 'cat3']   
   }
];

如果你这样做:

_.groupBy(programs, function(item){ return item.categories; });

它返回:

{
  'cat1, cat2': Array[1],
  'cat1, cat3': Array[1],
  'cat2': Array[1]
}

2 个答案:

答案 0 :(得分:3)

通过互联网搜索后,我自己尝试使用Underscore.js

最后,我得到了适合我的解决方案:

var group = _.groupBy(_.flatten(_.pluck(programs, 'categories')), function(item){
    return item;
});

返回:

{
  'cat1': Array[2], 
  'cat2': Array[2], 
  'cat3': Array[1]
}

http://jsfiddle.net/pypurjf3/2/

我希望这能帮助一些人解决同样的问题。

答案 1 :(得分:0)

我遇到了类似的问题,但想要对分组的出现方式做多了解。这就是我最终得到的结果:



function groupByNested(theList, whichValue) {
  // Extract unique values, sort, map as objects
  var groups = _.chain(theList).pluck(theList, whichValue).flatten().uniq().reject(function(v) { return v==''; }).sort().map(function(g) { return { group: g, items: [] }; }).value();
  
  // Iterate through the array and add applicable items into the unique values list
  _.each(_ls.plants, function(p) {
    _.each(p[whichValue], function(v) {
      theGroup = _.find(groups, function(g) { return g.group == v; });
      theGroup.items.push(p);
    });
  });
  return groups;
}