带计数的组数组

Group Array with count

我有一个包含多个属性的项目数组。其中一个属性是标签数组。获取这些项目中使用的所有标签并按这些标签在这些项目上使用的次数排序的最佳方法是什么?我一直在尝试寻找下划线 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 进行分组

您只需使用归约操作即可完成此操作。例如

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>');

将所有标签数组映射到一个数组中,然后countBy

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

使用下划线chain实用程序

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

你也可以试试这个:

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;
  }, {});