我用Array构造函数和Array.fill方法制作了一个多维数组。 我无法弄清楚问题出在哪里,但是此代码无法按我的意愿工作。
function loadChunk(){
for(var x = 0; x< 3; x++){
for(var y= 0; y < 3; y++){
console.log(x+","+y);
console.log((world[x][y]).loaded);
if(!(world[x][y]).loaded){
world[x][y].loaded=true;
}
}
}
}
function createWorld(w, d){
var worldz = new Array(d * 2 + 1);
var world = new Array(w * 2 + 1);
world.fill(worldz);
for(var x = 0; x< w * 2+ 1; x++){
for(var z = 0; z < d * 2 + 1; z++){
world[x][z]= { loaded: false };
}
}
return world;
}
var world = createWorld(1, 1);
Start();
function Start(){
loadChunk();
}
您可以看到控制台发生了什么。
我认为,不应在控制台上写任何true
。
问题是,如果我编辑world[0][n]
,那么world[1 or more][n]
也会发生变化。
答案 0 :(得分:0)
function loadChunk() {
for (var x = 0; x < 3; x++) {
for (var y = 0; y < 3; y++) {
console.log(x + "," + y, (world[x][y]).loaded);
if (!(world[x][y]).loaded) {
world[x][y].loaded = true;
}
}
}
}
function createWorld(w, d) {
var world = [];
for (var x = 0; x < w * 2 + 1; x++) {
world[x] = [];
for (var z = 0; z < d * 2 + 1; z++) {
world[x][z] = {loaded: false};
}
}
return world;
}
var world = createWorld(1, 1);
Start();
function Start() {
loadChunk();
}
您遇到的问题是,您用相同的数组填充了世界的“行”,所以world [0] === world [1] && world [1] === world [2],因为数组变量< strong> worldz 持有引用
了解问题的最好方法是做下一件事:
function createWorld(w, d){
var worldz = new Array(d * 2 + 1);
var world = new Array(w * 2 + 1);
world.fill(worldz);
for(var x = 0; x< w * 2+ 1; x++){
for(var z = 0; z < d * 2 + 1; z++){
world[x][z]= { loaded: false };
debugger;
}
}
return world;
}
第一步,在chrome调试器中检查 world 变量会发生什么情况
答案 1 :(得分:0)
为此替换您的createWorld函数:
function createWorld(w, d){
var world = new Array(w * 2 + 1);
for(var x = 0; x< w * 2+ 1; x++){
// each item of the array requires a new instance
// you should not use fill method in this situation
world[x]=new Array(d * 2 + 1);
for(var z = 0; z < d * 2 + 1; z++){
world[x][z]= { loaded: false };
}
}
return world;
}
答案 2 :(得分:0)
world [0] [0]的更改也会同时更改world [1] [0]和world [2] [0](与worldz的其他指标相同)的原因是world.fill(worldz)使世界的所有元素都属于相同的相同对象(数组)worldz。 为了避免这种情况,世界上的每个元素都应该是一个新的数组,例如:
for(n=0,max=world.length;n<max;n++) {world[n] = new Array(d * 2 + 1);}