用于循环创建无限对象树

时间:2015-07-08 23:53:14

标签: javascript arrays object for-loop

我有2个for循环创建一个对象:

function newImage(){
    image = {};
    var temp = {}
    for(i=0;i!=250;i++){
        temp[i] = {};
    }
    image = temp;
    for(i=0;i!=250;i++){
        image[i] = temp;
    }
}

这应该创建一个具有250个值的对象,每个值都是一个包含250个对象的对象。但是,它会创建一个创建250个值的对象,填充250个值,并将其循环一段时间。我还没有找到树的尽头,但它并没有冻结让我相信它是有限的。我已经检查了最多50次的迭代,它一直工作(它没有制作长树)。看起来好像是在最后一次迭代中发生的。 Here's the full thing.

2 个答案:

答案 0 :(得分:1)

var temp = {}
for(i=0;i!=250;i++){
    temp[i] = {};
}

上面的行创建了一个对象,并用250个其他对象填充它(到目前为止一直很好)。

然后image = temp;将图像(全局)变量设置为temp(因此图像现在包含250个对象)然后:

for(i=0;i!=250;i++){
    image[i] = temp;
}

这将使用对父对象的引用替换这250个对象中的每一个(覆盖先前的赋值),因此对象具有250个属性,这些属性都引用自身。

你写的有效的是:

image = {};
for ( var i = 0; i < 250; i++ )
    image[i] = image;

然后看起来你有一个无限的对象树,而你只有一个对象,它有许多引用自身的属性,所以每当你下降到一个孩子时你最终回到父对象(并扩展对象层次结构)浏览器使它看起来是一个无限的树,当它实际上只反复显示同一个对象时。

你可能想写的是:

function newImage(){
    var temp = {};
    for( var i=0; i < 250; i++){
        temp[i] = {};
        for( var j=0; j<250; j++){
           temp[i][j] = {};
        }
    }
    return temp;
}

答案 1 :(得分:0)

您的问题是,当您将image分配给temp时,对这两个对象的任何进一步修改都会反映在另一个对象上。

请尝试使用以下代码:

function newImage(){
    image = {};
    var temp = {}
    for(i=0;i!=250;i++){
        temp[i] = {};
    }
    for(var item in temp){
        image[item] = temp[item];
    }
    for(i=0;i!=250;i++){
        image[i] = temp;
    }
}