JavaScript矩阵转置函数异常:结果不符合预期问题排查
问题原因
你遇到的问题核心在于数组填充方式错误:
let matrix = Array(colSize).fill(Array(keySize))
fill方法会将传入的同一个数组引用复制到matrix的每一个位置,也就是说matrix[0]、matrix[1]、matrix[2]、matrix[3]指向的是同一个数组对象。当你在循环里修改matrix[j][i]时,其实是在修改同一个数组的元素,最后所有行都会变成最后一次赋值的结果(也就是最后一列的数值)。
修复方案
需要为matrix的每一行创建独立的数组实例,避免引用共享。可以用以下几种方式:
方法1:使用Array.from创建二维数组
let suggestionsArray = [[1,2,3,4],[5,6,7,8], [9,10,11,12], [13,14,15,16]] const keySize = suggestionsArray.length; const colSize = suggestionsArray[0].length // 用Array.from创建每行独立的数组 let matrix = Array.from({length: colSize}, () => Array(keySize)) for (let i = 0; i < keySize; i++) { for (let j = 0; j < colSize; j++) { matrix[j][i] = suggestionsArray[i][j] } } console.log(matrix) return matrix
方法2:用循环初始化每一行
let suggestionsArray = [[1,2,3,4],[5,6,7,8], [9,10,11,12], [13,14,15,16]] const keySize = suggestionsArray.length; const colSize = suggestionsArray[0].length let matrix = [] // 循环创建每行的空数组 for (let j = 0; j < colSize; j++) { matrix.push([]) } for (let i = 0; i < keySize; i++) { for (let j = 0; j < colSize; j++) { matrix[j][i] = suggestionsArray[i][j] } } console.log(matrix) return matrix
方法3:更简洁的数组映射写法
如果你想简化代码,也可以用数组的map方法直接生成转置矩阵:
let suggestionsArray = [[1,2,3,4],[5,6,7,8], [9,10,11,12], [13,14,15,16]] const transposed = suggestionsArray[0].map((_, colIndex) => suggestionsArray.map(row => row[colIndex]) ) console.log(transposed) return transposed
修复后得到的转置矩阵会是符合预期的:
[ [1,5,9,13], [2,6,10,14], [3,7,11,15], [4,8,12,16] ]
内容的提问来源于stack exchange,提问作者Lakshya
相关产品推荐
相关产品推荐

