如何在underscore.js中获取数组对象键的总和?

6

我有以下数组:

var items = [
   {price1: 100, price2: 200, price3: 150},
   {price1: 10, price2: 50},
   {price1: 20, price2: 20, price3: 13},
]

我需要获取所有键值之和的对象,如下所示:

var result = {price1: 130, price2: 270, price3: 163};

我知道可以只使用循环,但我正在寻找一种underscore风格的方法 :)


你尝试过他们的文档吗?如果是这样,你尝试过自己完成这个任务吗? - user2437417
@ArturNowak:既然其他的评论都被删除了,我的大部分评论现在已经没有意义了,我会继续清理它们。反正那个对话毫无意义。 - user2437417
3个回答

5

不太美观,但我认为最快的方法是这样做

_(items).reduce(function(acc, obj) {
  _(obj).each(function(value, key) { acc[key] = (acc[key] ? acc[key] : 0) + value });
  return acc;
}, {});

或者,为了更加夸张(我认为如果你使用 lazy.js 代替 underscore,它将可以比上面的更快):

_(items).chain()
  .map(function(it) { return _(it).pairs() })
  .flatten(true)
  .groupBy("0") // groups by the first index of the nested arrays
  .map(function(v, k) { 
    return [k, _(v).reduce(function(acc, v) { return acc + v[1] }, 0)]     
  })
  .object()
  .value()

1
应该使用.each().forEach()(无论underscore如何命名)而不是.map(),因为您不是在构建数组。 - user2437417
@Erik: 我以为你想要“比循环更好”的方法?这个使用了两个循环。 - user2437417
1
@Erik:我已经读过了。请再次阅读您问题下的我的第一条评论。 - user2437417
我正在寻找下划线方法。在Artur的答案中,是否有像for、for/in这样的循环? - Erik
@Erik’╝ÜÕ«āõ╗¼Ķó½ń¦░õĖ║.reduce()ÕÆī.map()ŃĆé - user2437417
我认为在不使用两个嵌套循环的情况下对列表中的列表进行求和是很困难的(迭代对象实际上等同于遍历一个(key, value)对的列表):D - Artur Nowak

1
对于聚合,我建议使用 reduce
_.reduce(items, function(acc, o) {
    for (var p in acc) acc[p] += o[p] || 0;
    return acc;
}, {price1:0, price2:0, price3:0});

或者更好
_.reduce(items, function(acc, o) {
    for (var p in o)
        acc[p] = (p in acc ? acc[p] : 0) + o[p];
    return acc;
}, {});

如果“items”键与“price1”、“price2”和“price3”不同怎么办? - Artur Nowak
这个解决方案允许您选择要总结的属性。当然,您也可以动态计算该列表,或者只需使用 for (var p in o) acc[p] = (p in acc ? acc[p] : 0) + o[p];(特别是如果每个项目具有不同的属性) - Bergi
返回{price1: 130, price2: 270, price3: NaN}。 - YD1m
@YD1m:感谢您的提示,我最初认为每个项目都具有相同的属性集。解决方案已经调整(并集成了第二个)。 - Bergi

0

地狱中的Js:

var names = _.chain(items).map(function(n) {  return _.keys(n);  }).flatten().unique().value();    
console.log(_.map(names, function(n) {              
      return  n + ': ' + eval((_.chain(items).pluck(n).compact().value()).join('+')); 
}).join(', '));  

jsfiddle


此段内容与编程有关。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接