Underscore.js:集合中项的总和(Underscore.js: Sum of items

2019-07-18 11:58发布

我做了一个小plnkr 在这里展示我所想要的目的。 我有一个大的数据集,在这里我想总结各个类型一共拿到。

我能想到的迭代和增加的结果,对象哈希的,但不知道更优雅的方式用下划线来解决这个问题。 我使用underscore.js,但从未尝试过的地图减少或其他功能的范例。 请更新plnkr学习如何做到这一点。

http://plnkr.co/edit/B5HGxhwvWsfvOR97z7TL?p=preview

var data = [ {'type': "A", 'val':2},
  {'type': "B", 'val':3},
  {'type': "A", 'val':1},
  {'type': "C", 'val':5} ];


 _.each(data, function (elm, index) {
   console.log(elm);  
 });

 /*
 Desired output

 out = [ {'type': "A", 'total':3},
  {'type': "B", 'total':3},
  {'type': "C", 'total':5} ];

 */

Answer 1:

var data = [ { type: "A", val: 2 },
             { type: "B", val: 3 },
             { type: "A", val: 1 },
             { type: "C", val: 5 } ];

var groups = _(data).groupBy('type');

var out = _(groups).map(function(g, key) {
  return { type: key, 
           val: _(g).reduce(function(m,x) { return m + x.val; }, 0) };
});

DEMO



Answer 2:

几乎相同的答案@GregL,只是一个多一点下划线:

summed_by_type = _(data).reduce(function(mem, d) {
  mem[d.type] = (mem[d.type] || 0) + d.val
  return mem
}, {})

pairs = _(summed_by_type).map(function(v,k) { return {type: k, total: v} })


Answer 3:

下面的工作,但我相信它是类似于你脑子里想的是什么。 其优点是,通过使用对象的哈希存储汇总,您在这意味着你不必通过哈希每次迭代试图找到正确类型的对象类型的索引。 然后你通过它在最后一次迭代建立最终的输出数组。

Plunkr是在这里 。

代码如下:

var data = [ {'type': "A", 'val':2},
  {'type': "B", 'val':3},
  {'type': "A", 'val':1},
  {'type': "C", 'val':5} ];

var totalPerType = {};
for (var i = 0, len = data.length; i < len; ++i) {
  totalPerType[data[i].type] = totalPerType[data[i].type] || 0;
  totalPerType[data[i].type] += data[i].val;
}
var out = _.map(totalPerType, function(sum, type) {
  return { 'type': type, 'total': sum };
});

 console.log('out = ', out);

编辑:我已经创建了产生这是多么快甚至100万项数组(含6种可能的)的新plunkr 这里 。 正如你可以从控制台输出中看到,至少在Chrome Canary版,它运行在1/3秒左右。

我也做了jsPerf测试它是如何更快使用中间值散列,和它的作品了约50%的速度。



文章来源: Underscore.js: Sum of items in a collection