我有一系列包含多个属性的项目。其中一个属性是标签数组。获取这些项目中使用的所有标记的最佳方法是什么,并按照这些项目上使用这些标记的次数排序?我一直试图强调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进行分组
答案 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;
}, {});