首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Javascript三维数组分配Bug

Javascript三维数组分配Bug
EN

Stack Overflow用户
提问于 2018-08-07 16:22:15
回答 4查看 85关注 0票数 0

所以我有一个大小为54的三维javascript数组,4是一个布尔数组。我已将所有值初始化为false。我遇到的问题是,当我试图将单个值(例如,1)转换为true时,它会设置每个值以相同的1维结束,等于true (1,11,等等)。我还没有弄清楚这是为什么或如何发生,所以任何帮助都是值得感谢的。下面是设置数组和赋值的代码。

代码语言:javascript
复制
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]}`);

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-07 16:30:14

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

代码语言:javascript
复制
grid[i][j] = falseBoolArr;

所以当你改变它的时候,变化会在任何地方反映出来。您需要使用每个循环创建一个新的数组。类似于:

代码语言:javascript
复制
for (var j = 0; j < this.maxY; j++) {
    grid[i][j] = [false, false, false, false];
}

如果由于某种原因需要设置falseBoolArr一次。您可以使用slice()在循环中生成显式副本。

代码语言:javascript
复制
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]}`);

票数 0
EN

Stack Overflow用户

发布于 2018-08-07 16:30:45

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

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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2018-08-07 16:32:17

不要使用变量,问题是由于变量初始化,删除falseBoolArr变量并直接在for循环中使用。

代码语言:javascript
复制
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]}`);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51731381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档