6

so, I have a 2d array, which i decalre like this:

var grille = new Array(60).fill(new Array(30).fill(false));

I want to be able to change the value of one cell in the array, but when i do

grille[x][y] = "new value";

I have all the x array which contains "new value" at the index y, instead of array[x][y].

so i have

grille[1][y] = "new value"
grille[2][y] = "new value"
grille[3][y] = "new value"

instead of

grille[x][y] = "new value"
grille[1][y] = false

for example. It may be a noob error, but i'm very new to javascript and don't know how to do this.

Thanks for your help.

3
  • Not clear what the problem/question is. Commented Mar 8, 2017 at 14:09
  • I want to do grille[x][y] = "new value" , to change the value of grille[x][y], but when i do this, not only grille[x][y] is changed, but also grille[1][y], grille[2][y],... and i don't know why Commented Mar 8, 2017 at 14:25
  • Not the best person to explain this, but the issue is that all the arrays in grille are not actually unique, they are all sharing the same referenced array, which happens when you create them the way you did. I think you're looking for a 'deep copy' of the array. Commented Mar 8, 2017 at 14:36

3 Answers 3

8

In your case 'new Array(30).fill(false)' will be created only once. It wont be created for each element in 'new Array(60)'. So all 60 cells holds the same array reference. So, if you change one - it will update all its reference.

var grille = (new Array(60)).fill().map(function(){ return new Array(30).fill(false);});

Here, for each element in 'new Array(60)' 'new Array(30)' will be created and each cell hold a different reference now. Hope this helps.

Sign up to request clarification or add additional context in comments.

Comments

1

So what I was doing with this is that var grille = new Array(60).fill(new Array(30).fill(false)); filled grille with the same new array(30) and it wasn't creating a new array for each index of grille like I thought. So What I did instead is this

grille= new Array(60);
for (var i = 0; i < grille.length; i++) {
    grille[i] = new Array(30).fill(false);
}

Comments

0

Anyways, since the ES5 (I believe), you can do it this way:

var grille = Array.from(new Array(60),_=>new Array(30).fill(false))

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.