所以我有一个大小为[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]}`);
答案 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);