我正在尝试使用fill函数创建二维数组.它看起来像这样:
let map = new Array(3)
.fill(new Array(3)
.fill(0));
Run Code Online (Sandbox Code Playgroud)
当我尝试在特定索引处设置一个值时出现问题:
map[1][1] = 1;
Run Code Online (Sandbox Code Playgroud)
我希望有结果:
[[0, 0, 0],[0, 1, 0],[0, 0, 0]]
Run Code Online (Sandbox Code Playgroud)
但我收到了这个:
[[0, 1, 0],[0, 1, 0],[0, 1, 0]]
Run Code Online (Sandbox Code Playgroud)
看起来所有这些子阵列都引用了一个数组,但为什么呢?
问题是fill(new Array(3))首先创建一个新数组,然后使用它填充数组,以便每个元素指向相同的数组引用.当你改变它时,它会反映在所有这些中.
您可以使用Array.from()外部数组,它需要一个函数.这将允许您为每个数组创建一个新数组:
let map = Array.from(Array(3), () => new Array(3).fill(0))
map[1][1] = 1;
console.log(map)Run Code Online (Sandbox Code Playgroud)
在这里,它将为每个元素调用函数,以确保为每个元素创建一个唯一的数组.