推送到嵌套数组中的一个元素是添加到 javascript 中的所有元素

Pushing to one element in a nested array is adding to all elements in javascript

我正在创建一个预填充的嵌套数组并希望将元素推送到特定索引,但这些元素正在添加到所有索引。

let arr = new Array(4).fill([])
arr => Array(4) [ [], [], [], [] ] //this is what I want
arr[0].push(3)
arr => Array(4) [ [3], [3], [3], [3] ] //I only wanted to push 3 to first index,
//why do all indexes have this element?

任何有关如何仅更新一个索引的帮助将不胜感激。

let arr = new Array(4).fill([])

这是将 arr 创建为一个数组,其中包含 四个对同一数组的引用 [] 作为参数传递)。因此,修改任何引用都会修改底层数组,并且由于所有引用都引用了它,因此您在记录对象时会注意到这一点。

> arr[0] === arr[1]
< true

只需使用一个好的 ol' for,或者如果我们只谈论 4 个元素,甚至可以简单地 [[],[],[],[]]

let arr = new Array(4)

for (let i = 0; i < arr.length; i++)
    arr[i] = new Array()
> arr[0] === arr[1]
< false

这种初始化方法给出了一个长度为 4 的数组,每个元素中都有一个空数组:

[...Array(4)].map(() => []); // [[], [], [], []]

或者例如您可以使用

[...Array(4)].map((_, i) => i); // and get [0, 1, 2, 3]