Javascript 3维数组分配错误

时间:2018-08-07 16:22:16

标签: javascript arrays multidimensional-array

所以我有一个大小为[5] [5] [4]的3维javascript数组,[4]是一个布尔数组。我已将所有值初始化为false。我遇到的问题是,当我尝试将单个值(例如[0] [0] [1])切换为true时,它将设置以相同的[1]维结尾的所有值都等于true([0] [1] [1],[1] [0] [1]等)我无法弄清楚为什么或如何发生这种情况,因此可以提供任何帮助。我用于设置数组和分配值的代码如下。

this.maxX = 5;
this.maxY = 5;

var grid = [];
var falseBoolArr = [false, false, false, false];

for (var i = 0; i < this.maxX; i++) {
  grid[i] = [];
  for (var j = 0; j < this.maxY; j++) {
    grid[i][j] = falseBoolArr;
  }
}
grid[0][0][0] = true
grid[0][0][1] = false
console.log(`Grid at 0,0,0 = ${grid[0][0][0]}`);
console.log(`Grid at 0,1,0 = ${grid[0][1][0]}`);
console.log(`Grid at 1,0,0 = ${grid[1][0][0]}`);
console.log(`Grid at 0,0,1 = ${grid[0][0][1]}`);

4 个答案:

答案 0 :(得分:1)

您要将第二个数组中的每个项目设置为变量引用,而不是数组。因此,当您更改其中的任何一个时,您都将全部更改,因为它们都引用相同的变量。

不使用变量就初始化,问题消失了……

this.maxX = 5;
this.maxY = 5;

var grid = [];

for (var i = 0; i < this.maxX; i++) {
  grid[i] = [];
  for (var j = 0; j < this.maxY; j++) {
    grid[i][j] = [false, false, false, false];
  }
}
grid[0][0][0] = true
grid[0][0][1] = false
console.log(`Grid at 0,0,0 = ${grid[0][0][0]}`);
console.log(`Grid at 0,1,0 = ${grid[0][1][0]}`);
console.log(`Grid at 1,0,0 = ${grid[1][0][0]}`);
console.log(`Grid at 0,0,1 = ${grid[0][0][1]}`);

答案 1 :(得分:0)

您正在将所有内容设置为同一阵列。所有对同一falseBoolArr数组的引用

grid[i][j] = falseBoolArr;

因此,当您进行更改时,更改会无处不在。您需要在每个循环中创建一个新的数组。像这样:

for (var j = 0; j < this.maxY; j++) {
    grid[i][j] = [false, false, false, false];
}

如果出于某种原因需要一次设置falseBoolArr。您可以使用slice()在循环中进行显式复制:

this.maxX = 5;
this.maxY = 5;

var grid = [];
var falseBoolArr = [false, false, false, false];

for (var i = 0; i < this.maxX; i++) {
  grid[i] = [];
  for (var j = 0; j < this.maxY; j++) {
    grid[i][j] = falseBoolArr.slice();  // makes a copy
  }
}
grid[0][0][0] = true
grid[0][0][1] = false
console.log(`Grid at 0,0,0 = ${grid[0][0][0]}`);
console.log(`Grid at 0,1,0 = ${grid[0][1][0]}`);
console.log(`Grid at 1,0,0 = ${grid[1][0][0]}`);
console.log(`Grid at 0,0,1 = ${grid[0][0][1]}`);

答案 2 :(得分:0)

不要使用变量初始化问题是由于变量初始化引起的, 删除falseBoolArr变量,然后在for循环中直接使用它。

this.maxX = 5;
this.maxY = 5;

var grid = [];

for (var i = 0; i < this.maxX; i++) {
  grid[i] = [];
  for (var j = 0; j < this.maxY; j++) {
    grid[i][j] = [false, false, false, false];
  }
}
grid[0][0][0] = true
grid[0][0][1] = false
console.log(`Grid at 0,0,0 = ${grid[0][0][0]}`);
console.log(`Grid at 0,1,0 = ${grid[0][1][0]}`);
console.log(`Grid at 1,0,0 = ${grid[1][0][0]}`);
console.log(`Grid at 0,0,1 = ${grid[0][0][1]}`);

答案 3 :(得分:0)

在JavaScript中,数组和对象是通过引用传递的,这意味着grid[0][1][0]grid[0][0][0]指向同一个对象。这就是该行为的原因。

尝试将grid[i][j] = falseBoolArr;替换为grid[i][j] = falseBoolArr.slice(0);