Js多维数组设置值奇怪

时间:2019-01-29 15:21:29

标签: javascript

我用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]也会发生变化。

3 个答案:

答案 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);}