JavaScript中使用reduce计算二维数组每行元素和遇问题求助
二维数组行求和的reduce实现问题分析
你的reduce代码无法正常运行的核心原因是:Array.push()方法返回的是数组的新长度,而非数组本身。外层reduce的累加器在第一次调用push后变成了数字,后续迭代时试图对数字调用push方法,直接抛出错误。
错误代码的问题拆解
以示例输入[[4, 5, 6], [6, 5, 4], [5, 5, 5]]为例:
- 第一次迭代:累加器
rowSums是空数组,push(15)返回数字1,外层reduce将这个数字作为下一次的累加器。 - 第二次迭代:尝试对数字
1调用push方法,此时会抛出TypeError: rowSums.push is not a function,代码中断。
正确的reduce实现方式
有两种可靠的写法,都能和原for循环实现相同的效果:
方式1:先push再返回原累加器数组(性能更优)
const rowSums = matrix.reduce((rowSums, currentRow) => { // 计算当前行的和并推入结果数组 rowSums.push(currentRow.reduce((sum, currentEl) => sum + currentEl, 0)); // 返回原数组作为下一次迭代的累加器 return rowSums; }, []);
方式2:返回新数组(不修改原累加器,更符合函数式编程风格)
const rowSums = matrix.reduce((rowSums, currentRow) => { const currentRowSum = currentRow.reduce((sum, currentEl) => sum + currentEl, 0); // 展开原数组并添加新的行和,返回新数组 return [...rowSums, currentRowSum]; }, []);
两种方式对示例输入的输出结果均为[15, 15, 15],和原for循环的执行结果完全一致。
内容的提问来源于stack exchange,提问作者Math Student
相关产品推荐
相关产品推荐

