bsr*_*bsr 17 javascript underscore.js
我在这里做了一个小plnkr 来展示我想要实现的目标.我有一个大数据集,我喜欢总结个人类型以获得总数.
我可以想到迭代并将结果添加到对象哈希,但想知道用下划线解决它的更优雅方式.我使用的是underscore.js,但从未尝试过map reduce或其他功能范例.请更新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} ];
*/
Run Code Online (Sandbox Code Playgroud)
Ser*_*kiy 32
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) };
});
Run Code Online (Sandbox Code Playgroud)
Nev*_*vir 12
与@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} })
Run Code Online (Sandbox Code Playgroud)
以下内容可行,但我认为它类似于您的想法.优点是通过使用对象哈希来存储总数,您可以对类型进行索引,这意味着每次尝试查找具有正确类型的对象时都不必遍历哈希.然后在最后迭代它一次以构建最终的输出数组.
普兰克在这里.
代码如下:
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);
Run Code Online (Sandbox Code Playgroud)
编辑:我已经创建了产生这是多么快甚至100万项数组(含6种可能的)的新plunkr 这里.从控制台输出中可以看出,至少在Chrome Canary中,它运行大约1/3秒.
我还做了一个jsPerf测试,测试使用中间散列的速度有多快,并且它的速度提高了大约50%.