用下划线计数的字典和数组

时间:2018-03-24 03:08:37

标签: node.js underscore.js

这是一个非常微不足道的问题,但我只是在寻求一种优雅的方法,因为下划线非常强大。

我有一系列这样的词典:

dict = [{name: 'bob',
         tags: ['tag1', 'tag2']},
         {name: 'alice',
         tags: ['tag1']},
         {name: 'John',
         tags: ['tag2', 'tag3']}];

我想返回一个像这样的数组

result = [
  {tag1: 2},
  {tag2: 2},
  {tag3: 3}
];

换句话说,我想计算所有出现标签的出现次数。这显然可以通过几个for循环实现,但我想知道是否有一个明显的解决方案。

1 个答案:

答案 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;
&#13;
&#13;

原生JS解决方案。

&#13;
&#13;
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;
&#13;
&#13;