2 回答
TA贡献1806条经验 获得超5个赞
前面的答案很好,但只有当你的数组总是相同的大小时它才有效。
例如,有这个初始输入会破坏代码:
[
[{data:1},{data:2},{data:3}, {data:4}],
[{data:1},{data:2},{data:3}],
[{data:1},{data:2},{data:3}]
]
要解决这个问题,您可以在 reducer 中添加一个检查,以确保下一个数组在该索引处有一个对象。
另一个问题是如果你有这个初始输入:
[
[{data:1},{data:2},{data:3}, {data:4}],
[{data:1},{data:2},{data:3}, {data:4}, {data:5}],
[{data:1},{data:2},{data:3}]
]
第二个数组中的最后一个对象将被忽略,因为初始 reducer 只考虑length第一个数组的。
要处理这些异常,您可以使用此重构代码(基于@mickl 答案):
// Initial input with different format
const initialInput = [
[{data:1},{data:2},{data:3}, {data:4}],
[{data:1},{data:2},{data:3}, {data:4}, {data:5}],
[{data:1},{data:2},{data:3}]
];
// Sort and reverse to get the array with most items first
const sortedInput = initialInput.sort().reverse();
// Finally use the refactored reducer
const result = sortedInput.reduce((arr,cur) => {
return arr.map((val, i) => {
// This "if" checks if the next array has an item on the same index of previous array
// Which is not the case, for example, from the second to the third item
if (cur[i] && cur[i].data) {
return { data: val.data + cur[i].data }
} else {
return { data: val.data}
}
})
});
console.log(result)
TA贡献1794条经验 获得超8个赞
您可以使用array.reduce
跨多个数组聚合数据array.map
并对值求和,因为它采用箭头函数,其中第二个参数表示当前处理元素的索引:
let input = [
[{data:1},{data:2},{data:3}],
[{data:1},{data:2},{data:3}],
[{data:1},{data:2},{data:3}]
];
let result = input.reduce((arr,cur) =>
arr.map((val, i) => ({ data: val.data + cur[i].data })));
console.log(result);
添加回答
举报