[英]SUM all values of an array of objects by array index of object property in JavaScript / JQuery
我有一个这样的对象数组
[
{Ref: "A", Vals: [1,2,3,100]},
{Ref: "B", Vals: [1,2,3,100]},
{Ref: "C", Vals: [1,2,3,100]}
]
我想按索引生成一个数组,它是 B 和 C(不是 A)之和,所以结果是
[2,4,6,200]
我可以使用多个循环来执行此操作,如下所示:
var output= [];
var filteredArray = $.grep(arr, function (v) {
return v.Ref !== "A";
});
$.each(filteredArray, function (i, v) {
$.each(v.Vals, function (i, v) {
output[i] += v;
});
});
但这似乎很冗长且效率低下。 有没有更优雅/更有效的方法来实现这一目标?
你可以做一个过滤器,然后是一个 map (只挑选出Vals
),然后在该过滤/映射数组上使用 reduce 。
input.filter(obj => {
return obj.Ref !== "A"
}).map(obj => {
return obj.Vals
}).reduce((carry, obj) => {
if (!carry) { return obj }
// This bit could be optimised more, right now it fails if the
// 'Vals' differ in length.
var response = carry
for (var i = 0; i < obj.length; i++) {
response[i] += obj[i]
}
return response
})
您可以为要包含在计算中的那些Vals
定义一个Ref
值数组,然后使用reduce
和find
来获取具有正确计算的数组。
const data = [{Ref: "A", Vals: [1,2,3,100]}, {Ref: "B", Vals: [1,2,3,100]}, {Ref: "C", Vals: [1,2,3,100]}] const result = ['A', 'C'].reduce((r, e) => { const match = data.find(({ Ref }) => Ref === e); if (match) { if (.r) r = match.Vals else match.Vals,forEach((el, i) => r[i] += el) } return r }. null) console.log(result)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.