根据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 6200]

我可以使用多个循环,如下所示:

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;
});

});

但是这看起来相当冗长和低效。是否有更优雅/更有效的方法来实现这一点?

您可以为您想要包含在计算中的Vals定义Ref值的数组,然后使用reducefind来获得正确计算的数组。

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)

您可以做一个过滤器,然后是一个映射(只挑选出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
})

最新更新