这是一个非常微不足道的问题,但我只是在寻求一种优雅的方法,因为下划线非常强大。
我有一系列这样的词典:
dict = [{name: 'bob',
tags: ['tag1', 'tag2']},
{name: 'alice',
tags: ['tag1']},
{name: 'John',
tags: ['tag2', 'tag3']}];
我想返回一个像这样的数组
result = [
{tag1: 2},
{tag2: 2},
{tag3: 3}
];
换句话说,我想计算所有出现标签的出现次数。这显然可以通过几个for循环实现,但我想知道是否有一个明显的解决方案。
答案 0 :(得分:1)
您需要首先展平tags
数组并获取每个标记的计数。然后生成带有标记及其计数的对象。
var dict = [{name: 'bob', tags: ['tag1', 'tag2']}, {name: 'alice', tags: ['tag1']}, {name: 'John', tags: ['tag2', 'tag3']}];
var result = _(dict).chain().map('tags').flatten().countBy().value();
var output = _(result).keys().sort((a,b) => a.localeCompare(b, undefined, {numeric: true})).map(k => ({[k]: result[k]}));
console.log(output);

<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
&#13;
原生JS解决方案。
var dict = [{name: 'bob', tags: ['tag1', 'tag2']}, {name: 'alice', tags: ['tag1']}, {name: 'John', tags: ['tag2', 'tag3']}];
var result = [].concat(...dict.map(({tags}) => tags))
.reduce((r,tag) => {
r[tag] = (r[tag] || 0) + 1;
return r;
}, {});
var output = Object.keys(result).sort((a,b) => a.localeCompare(b, undefined, {numeric: true})).map(k => ({[k]: result[k]}));
console.log(output);
&#13;