1

I am creating a prefilled nested array and want to push elements to specific indexes, but the elements are being added to all indexes.

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?

Any help on how to just update one index would be appreciated.

xeroshogun
  • 1,062
  • 1
  • 18
  • 31

2 Answers2

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

This is creating arr as an array of four references to the same array ([] passed as argument). Thus, modifying any of the references modifies the underlying array, and since it's referenced by all of them, you will notice this when logging the object.

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

Just use a good ol' for, or even simply [[],[],[],[]] if we are just talking about 4 elements.

let arr = new Array(4)

for (let i = 0; i < arr.length; i++)
    arr[i] = new Array()
> arr[0] === arr[1]
< false
Marco Bonelli
  • 63,369
  • 21
  • 118
  • 128
1

This initialization method gives an array of length 4 with an empty array in each element:

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

or for example you can use

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

A1exandr Belan
  • 4,442
  • 3
  • 26
  • 48