如何总结对象数组中的所有项?

时间:2017-02-04 01:26:38

标签: javascript arrays object foreach

我有一个对象数组:

available

我想将对象b中的所有值相加以得到总数15

3 个答案:

答案 0 :(得分:0)

从值数组中获取单个值的方法是Array#reduce,你给它一个累加器函数和一个可选的起始值,它将它应用于每个元素,直到它得到最终值:

var test = [{"a":1, "b":2, "c":3}, {"a":4, "b":5, "c":6},{"a":7, "b":8, "c":9}];

test
  .map(function pluckB(o) { return o.b }) // Take only the 'b' property
  // => [2,5,8]
  .reduce(function add(a, b) { return a + b }, 0); // Sum them, starting from 0
  // => 15

使用ES2015 arrow functions

可以更加平稳
test.map(o => o.b).reduce((a, b) => a + b, 0)

使用Ramda之类的功能实用程序库,只需调用两个函数:

R.sum(R.pluck('b', test))

正如@ibrahim mahrir可能想要在评论中暗示的那样,在JavaScript中实际上组合这样的操作可以更高效,并且只迭代数组一次而不是使用管道样式。那是因为.map.filter和co。创建新的数组副本而不是在适当的位置修改数组,并且该实例化具有成本 但是,除非此代码在非常紧密的循环中运行,否则与使用最易读的解决方案的可维护性相比,性能影响绝对可以忽略不计。

答案 1 :(得分:0)

使用reduce代替:

var test = [{"a":1, "b":2, "c":3}, {"a":4, "b":5, "c":6},{"a":7, "b":8, "c":9}];


var sum = test.reduce((s, o) => s + o.b, 0);

console.log(sum);

注意:此test.reduce((s, o) => s + o.b, 0)使用箭头功能。它与:

相同
test.reduce(function(s, o) {
    return s + o.b;
}, 0);

答案 2 :(得分:0)

如果要查找数组中每个对象的总和,请迭代数组,用值的总和覆盖当前元素。



var test = [{"a":1, "b":2, "c":3}, {"a":4, "b":5, "c":6},{"a":7, "b":8, "c":9}];

test.forEach((e, i, a) => a[i] = Object.values(e).reduce((x, y) => x + y, 0));

console.log(test)




如果要查找数组中每个对象的匹配属性值的总和,请迭代数组以创建新对象,并根据键添加值。



var test = [{"a":1, "b":2, "c":3}, {"a":4, "b":5, "c":6},{"a":7, "b":8, "c":9}];

var result = test.reduce((o, e) => {
  for(var i in e) 
    o[i] = (o[i] || 0) + e[i];
  return o;
}, {});

console.log(result);




你会注意到第二个对象的值等于15,以及名为" b"的属性的所有值,所以你并不完全清楚你是什么'在这之后重新开始。