0

I declare a 2d array in javascript as follows:

cell = {visited:false, left:true, top:true, right:true, bottom:true}

cells = new Array(10);

for (i = 0; i < 10; i++) //Initiate 2d cells array.
{
    cells[i] = new Array(cell,cell,cell,cell,cell,cell,cell,cell,cell,cell);
}

Later in the code I update one object in the array:

cells[0][0].visited = true;

However after I do this every visited attribute of every object in the array is marked true.

Goblaz
  • 53
  • 1
  • 8

2 Answers2

0

As @Pointy said, your code have this reference problem. You can resolve this with Object.create() building a "clone" of the object:

cell = {visited:false, left:true, top:true, right:true, bottom:true}

cells = new Array(10);

for (i = 0; i < 10; i++) //Initiate 2d cells array.
{
    cells[i] = new Array(
      Object.create(cell),
      Object.create(cell),
      Object.create(cell),
      Object.create(cell),
      Object.create(cell),
      Object.create(cell),
      Object.create(cell),
      Object.create(cell),
      Object.create(cell),
      Object.create(cell)
    );
}

cells[0][0].visited = true;

See also Clone Object without reference javascript [duplicate]

Community
  • 1
  • 1
Marvin Medeiros
  • 202
  • 4
  • 22
-1

Sorry I needed to initiate the array with separate objects not the same "cell":

for (i = 0; i < 10; i++) //Initiate 2d cells array.
{
cells[i] = new Array({visited:false, left:true, top:true, right:true,                     bottom:true},
    {visited:false, left:true, top:true, right:true, bottom:true},
    {visited:false, left:true, top:true, right:true, bottom:true},
    {visited:false, left:true, top:true, right:true, bottom:true},
    {visited:false, left:true, top:true, right:true, bottom:true},
    {visited:false, left:true, top:true, right:true, bottom:true},
    {visited:false, left:true, top:true, right:true, bottom:true},
    {visited:false, left:true, top:true, right:true, bottom:true},
    {visited:false, left:true, top:true, right:true, bottom:true},
    {visited:false, left:true, top:true, right:true, bottom:true});
}
Goblaz
  • 53
  • 1
  • 8