嵌套for循环结合数组push产生非预期结果的问题排查
问题原因分析与解决方案
嘿,这个坑我之前也踩过!你遇到的现象核心是数组引用共享的问题,咱们一步步拆解明白:
为什么所有子数组会同时被修改?
你写的[...Array(grid.length)].fill([])这里,fill([])会把同一个空数组的内存引用填充到新数组的每一个位置里。也就是说,newGrid[0]、newGrid[1]、newGrid[2]、newGrid[3]其实指向的是同一个数组。所以不管你调用newGrid[i].push(...)时i是多少,本质上都是在给那同一个数组加元素,最后自然会出现所有子数组完全相同、且攒够16个元素的情况。
怎么修复这个问题?
我们需要给newGrid的每一个位置都创建独立的空数组,而不是复用同一个引用。最直接的方法是用map生成每个子数组:
var maxIncreaseKeepingSkyline = function(grid) { // 用map生成每个独立的空数组,彻底避免引用共享 let newGrid = Array(grid.length).fill().map(() => []); for (let i = 0; i < grid.length; i++) { for (let j = 0; j < grid[i].length; j++) { newGrid[i].push(grid[j][i]); } } console.log(newGrid); }; console.log(maxIncreaseKeepingSkyline([[3,0,8,4],[2,4,5,7],[9,2,6,3],[0,3,1,0]]));
这样修改后,newGrid里的每个子数组都是全新创建的,相互之间没有关联,再执行push操作就只会修改对应的子数组,最终就能得到你预期的4个各含4个元素的转置矩阵了。
另外,还有一种更简洁的矩阵转置写法可以参考(核心还是解决引用问题):
// 利用Array.from和map快速实现矩阵转置 const transposed = Array.from({length: grid[0].length}, (_, i) => grid.map(row => row[i]) );
内容的提问来源于stack exchange,提问作者klcode
相关产品推荐
相关产品推荐

