我有一个对象数组:
available
我想将对象b中的所有值相加以得到总数15
答案 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"的属性的所有值,所以你并不完全清楚你是什么'在这之后重新开始。