【问题标题】:Group Array with count用计数分组数组
【发布时间】:2016-05-02 04:36:19
【问题描述】:

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

【问题讨论】:

标签: javascript arrays group-by underscore.js


【解决方案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>');

【讨论】:

  • 尝试实现此代码,但我得到 Object {[object Object]: 3} 这是预期的吗?我不确定如何获取每个标签的计数
  • @Snapper 你是怎么“得到”的(希望不是通过alert())?您的items 数组究竟是什么样的?
  • 很抱歉。我意识到我的标签数组与我最初发布的略有不同。会更新
【解决方案2】:

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

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

使用下划线chain 实用程序

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

【讨论】:

  • 我想我做错了什么。实现了这一点,并得到了与@Phil 下面的另一个答案相同的结果。 Object {[object Object]: 3} 我怎样才能得到标签以及它们被使用的频率?
  • 您的数据结构必须与我和菲尔使用的不同,b/c 我出于好奇检查了他的答案。看看我的jsfiddle,看看我们是否使用相同的数据jsfiddle.net/guanzo/ppfLwhyx/1
  • 感谢@Eric Guan 的代码,让我意识到我的结构与我最初发布的不完全一样。会更新。
  • 美丽的答案。我认为countBy 应该是countBy('id') 并且映射可以替换为pluck('tags')
【解决方案3】:

你也可以试试这个:

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

【讨论】:

    猜你喜欢
    • 2019-03-31
    • 2017-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2013-12-12
    • 2017-09-08
    • 1970-01-01
    相关资源
    最近更新 更多