如何沿索引添加多个数组中的对象

我有一个对象数组


[

  [{data:1},{data:2},{data:3}],

  [{data:1},{data:2},{data:3}],

  [{data:1},{data:2},{data:3}]

]

我需要[{data:3},{data:6},{data:9}]通过加法减少。添加索引 0 的对象,添加索引 1 的对象,以及添加索引 2 的对象。


有没有像reduce这样的Javascript函数可以管理这个?


偶然的你
浏览 112回答 2
2回答

忽然笑

前面的答案很好,但只有当你的数组总是相同的大小时它才有效。例如,有这个初始输入会破坏代码:[  [{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 formatconst 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 firstconst sortedInput = initialInput.sort().reverse();// Finally use the refactored reducerconst 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)

幕布斯7119047

您可以使用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);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript