JavaScript初始化二维数组规避浅拷贝的最佳方案
问题根因
你当前的初始化写法出现联动修改的核心原因是:Array.fill() 传入引用类型值(数组、对象等)时,填充到数组每个位置的都是同一个内存引用。也就是说你创建的visited数组里所有行都指向同一个子数组实例,修改任意一行的元素,本质都是修改那个共享数组,自然所有行的对应位置都会同步变化。
最佳初始化方案
用Array.from配合映射函数生成二维数组,保证每一行都是独立创建的新数组实例,不存在引用共享问题:
let grid = [ ["0", "1", "0"], ["1", "0", "1"], ["0", "1", "0"], ] // 正确初始化visited数组 let visited = Array.from({ length: grid.length }, () => new Array(grid[0].length).fill(false)) visited[0][1] = true console.log(visited)
执行后输出符合预期:
[ [ false, true, false ], [ false, false, false ], [ false, false, false ] ]
如果习惯用数组实例方法,也可以用下面的等价写法,效果完全一致:
let visited = new Array(grid.length).fill().map(() => new Array(grid[0].length).fill(false))
注意这个写法里
fill()不传参数,是为了先把数组填充为undefined占位,后续map遍历才能正常生成每一行的独立子数组。
内容的提问来源于stack exchange,提问作者stumped
相关产品推荐
相关产品推荐

