You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:11:27