首页 > 解决方案 > 如何根据内部子数组的第一项合并二维数字数组?

问题描述

给定二维数组[ [ 2, 12 ], [ 3, 12 ], [ 3, 15 ], [ 5, 15 ] ]

我想检查子数组的第一个元素是否等于邻居的第一个元素。如果它们相等,我想将它们的第二个元素相加并用新数组替换这两个元素。

所以输出必须是:[ [ 2, 12 ], [ 3, 27 ], [ 5, 15 ] ]

谢谢!我尝试了常规的 for 循环,但它抛出 TypeError 说它无法访问 undefined 的值

for (let i = 0; i < arr.length; i++) {
     if (arr[i][0] === arr[i+1][0]) console.log( arr[i] );
}

TypeError: Cannot read property '0' of undefined
at evalmachine.<anonymous>:5:29
at Script.runInContext (vm.js:74:29)
at Object.runInContext (vm.js:182:6)
at evaluate (/run_dir/repl.js:133:14)
at ReadStream.<anonymous> (/run_dir/repl.js:116:5)
at ReadStream.emit (events.js:180:13)
at addChunk (_stream_readable.js:274:12)
at readableAddChunk (_stream_readable.js:261:11)
at ReadStream.Readable.push (_stream_readable.js:218:10)
at fs.read (fs.js:2124:12)

标签: javascriptarraysmultidimensional-array

解决方案


你可以做这样的事情使用reduce

检查accumulator的最后一项是否与key上下文中的当前项相同。如果是,请对各value部分求和。否则,将项目推送到accumulator

const data = [[2, 12], [3, 12], [3, 15], [5, 15]];

const newArray = data.reduce((acc, a, i) => {
  if (i > 0 && a[0] === data[i-1][0])
    acc[acc.length-1][1] += a[1]
  else
    acc.push(a);
  return acc
}, [])

console.log(newArray)

上述逻辑使用三元和逗号运算符

const data = [[2, 12], [3, 12], [3, 15], [5, 15]];

const newArray = data.reduce((acc, a, i) => (
    i > 0 && a[0] === data[i-1][0]
     ? acc[acc.length-1][1] += a[1]
     : acc.push(a), acc), [])

console.log(newArray)


推荐阅读