具有计数的组数组

时间:2016-05-02 04:36:20

标签: javascript arrays group-by underscore.js

我有一系列包含多个属性的项目。其中一个属性是标签数组。获取这些项目中使用的所有标记的最佳方法是什么,并按照这些项目上使用这些标记的次数排序?我一直试图强调js但没有得到预期的结果。

return _.groupBy(items, 'tags');

我的数据示例:

item1
 - itemName: item1
 - tags(array): tag1, tag2

item2
 - itemName: item2
 - tags(array): tag1, tag3

所以我试图获得类似{tag1, 2}{tag2, 1}{tag3, 1}

的内容

更新:我的标签包含ID和名称。我试图按这些ID进行分组

3 个答案:

答案 0 :(得分:3)

将所有标记数组映射到单个数组,然后countBy

var tags = _.flatten(_.map(items,d=>d.tags))
tags = _.countBy(tags)

使用下划线chain实用程序

var tags = _.chain(items).map(d=>d.tags).flatten().countBy().value();

答案 1 :(得分:1)

您只需使用reduce操作即可。例如

var items = [{
  itemName: 'item1',
  tags: [
    {id: 'tag1', name: 'Tag 1'},
    {id: 'tag2', name: 'Tag 2'}
  ]
}, {
  itemName: 'item2',
  tags: [
    {id: 'tag1', name: 'Tag 1'},
    {id: 'tag3', name: 'Tag 3'}
  ]
}];

var tags = items.reduce((tags, item) => {
  item.tags.forEach(tag => {
    tags[tag.id] = tags[tag.id] || 0;
    tags[tag.id]++;
  });
  return tags;
}, {});

document.write('<pre>' + JSON.stringify(tags, null, '  ') + '</pre>');

答案 2 :(得分:0)

你也可以试试这个:

var tagGroup =
  items.reduce(function(p, c){
      c.tags.map(function(tag){     
        p[tag] = p[tag] || {count:0};         
        p[tag].count++;
        return p;
      });

      return p;
  }, {});