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

JavaScript forEach循环内二维矩阵赋值结果异常排查

问题描述

bitGraph.dfs() 函数返回格式为 'i,j' 的字符串数组,预期目标是解析字符串中的索引,将矩阵对应位置赋值为1,但实际运行时矩阵整列被统一赋值为0或1,不符合预期。
调试发现:result[x][y] = 1 语句并未在每次 forEach 迭代时单独修改对应位置,反而在 forEach 运行结束后,矩阵y列的所有元素都被统一赋值为1。

相关代码如下:
矩阵初始化逻辑:

const result = Array(N).fill(Array(M).fill(0));

循环内赋值逻辑:

bitGraph.dfs(`${N - 1},${j}`, visited)
    .forEach(node => {
        const [x, y] = node.split(',')
            .map(index => Number(index));
        result[x][y] = 1;
    });

问题复现示例:

当dfs返回数组为 ['5,0', '4,0', '1,5', '1,4', '1,3'] 时,实际输出的result矩阵:

[
    [ 1, 0, 0, 1, 1, 1 ],
    [ 1, 0, 0, 1, 1, 1 ],
    [ 1, 0, 0, 1, 1, 1 ],
    [ 1, 0, 0, 1, 1, 1 ],
    [ 1, 0, 0, 1, 1, 1 ],
    [ 1, 0, 0, 1, 1, 1 ]
]
异常原因

问题出在矩阵初始化的写法上:Array.fill() 传入的参数如果是数组、对象这类引用类型,填充到数组中的是同一个内存引用,不是独立的副本。
上述初始化代码中,Array(M).fill(0) 只执行了1次,生成了1个长度为M、全为0的数组,之后这个数组的引用被重复填充了N次到外层数组——也就是说result的N个子数组,本质指向内存中的同一个数组。此时修改任意一个 result[x][y],实际都是在修改这个共享数组的y索引位置,自然所有行的y列都会同步变更,最终出现整列值统一的异常。

修复方法

初始化矩阵时,不要直接用fill填充引用类型值,改为为每一行生成独立的新数组即可,两种常用实现:

  • 用Array.from映射生成独立行
const result = Array.from({ length: N }, () => Array(M).fill(0));
  • 用map遍历生成独立行
const result = Array(N).fill().map(() => Array(M).fill(0));

两种写法的核心逻辑一致:每一行的子数组都是单独执行Array(M).fill(0)生成的全新实例,互相之间没有引用关联,修改某一行的指定位置不会影响其他行,赋值逻辑就会符合预期。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 04:39:36