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

嵌套循环中无法正确设置JavaScript二维数组问题排查

二维数组赋值异常的原因与修复方案

问题根源

你代码里的核心问题出在二维数组初始化这一行:

points = new Array(GRID_WIDTH).fill(new Array(GRID_WIDTH).fill({}));

Array.fill() 方法对于引用类型(比如数组、对象),填充的是同一个引用,而非新的副本。也就是说,points数组里的每一行,都指向同一个子数组实例。当你在内循环修改points[y][x]时,所有行的对应x位置都会被同步修改,最终所有行内容完全一致,看起来就像内循环只对第一行生效。

修复方案

需要为每一行创建独立的子数组,替代原来的fill写法。有两种简单方式:

方式1:使用Array.from

points = Array.from({length: GRID_WIDTH}, () => new Array(GRID_WIDTH).fill({}));

Array.from的第二个参数是映射函数,每次调用都会返回一个新的子数组,确保每一行都是独立的。

方式2:用循环手动初始化

points = new Array(GRID_WIDTH);
for (let y = 0; y < GRID_WIDTH; y++) {
  points[y] = new Array(GRID_WIDTH).fill({});
}

通过循环逐个创建子数组,同样能保证每一行的独立性。

修复后的完整setup函数示例

function setup() {
  createCanvas(windowWidth, windowHeight, WEBGL);
  stroke("#000");
  R = 100;
  angleMode(RADIANS);
  // 替换成正确的初始化方式
  points = Array.from({length: GRID_WIDTH}, () => new Array(GRID_WIDTH).fill({}));
  
  // 计算并绘制每个点
  for (let y = 0; y < GRID_WIDTH; y++) {
    for (let x = 0; x < GRID_WIDTH; x++) {
      points[y][x] = Object.assign({}, grid2Sphere(x, y));
      console.log(points[y][x]);
    }
    console.log(points[y]); // 现在会打印当前y行的正确内容
  }
  
  drawPoints(points);
}

补充说明

你在内循环里用Object.assign({}, grid2Sphere(x, y))是没问题的,确保了每个位置的对象都是独立副本,不会出现对象引用共享的问题,问题只出在二维数组的行引用上。

内容的提问来源于stack exchange,提问作者JBrown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 00:56:02