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