我有一个这样的对象数组
[
{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;
});
});
但这似乎是相当冗长和低效的。有没有更优雅/更有效的方法来实现这一点?
发布于 2021-03-08 21:27:39
您可以为要包括在计算中的那些Ref
定义一个Vals
值数组,然后使用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)
发布于 2021-03-08 21:03:54
您可以先做一个过滤器,然后再做一个映射(以便只挑选出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
})
https://stackoverflow.com/questions/66529698
复制相似问题