Javascript:在数组中设置一个值会将所有其他值设置为该值

时间:2014-09-13 19:42:26

标签: javascript arrays

当我尝试在javascript中设置数组中的值时,所有其他“相邻”值也会发生变化。

var screenData = [];
function init() {
    var properties = { "property": "value" }
    for( i = 0; i < 35; i++ ) {
        var row = [];
        for( j = 0; j < 19; j++ ) {
            row.push(properties);
        }
        screenData.push(row);
    }
}
init();
screenData[0][0].property = "othervalue";
alert(screenData[0][1].property);

警报将返回othervalue,但应该是value :(

我是否只是监督某事或这是一个错误?

任何帮助将不胜感激:3

4 个答案:

答案 0 :(得分:1)

这是因为您引用了同一个对象(properties),因此每次修改property时都会更新它。

function init() {
    for( i = 0; i < 35; i++ ) {
        var row = [];
        for( j = 0; j < 19; j++ ) {
            row.push({ property: 'value' });
        }
        screenData.push(row);
    }
}

答案 1 :(得分:0)

那是因为你在每次迭代中推送相同的对象,你应该clone the object然后push克隆的对象。目前,所有数组的元素都引用同一个对象。

答案 2 :(得分:0)

这不是错误。您正在将对属性对象的引用推送到数组中。这意味着您的数组包含对同一对象的多个引用。您可以通过重置for循环中的属性变量来解决此问题。

function init() {
   for( i = 0; i < 35; i++ ) {
        var row = [];
        for( j = 0; j < 19; j++ ) {
            var properties = { "property": "value" }
            row.push(properties);
        }
        screenData.push(row);
    }
}

答案 3 :(得分:0)

我想,而不是:

for( j = 0; j < 19; j++ ) {
        row.push(properties);
    }
screenData.push(row);

可能是:

for( j = 0; j < 19; j++ ) {
        row.push(_clone(properties));
    }
screenData.push(row);

_.clone(object)是Underscore库函数:UnderScore _clone references

请注意,正如您在此处所读到的,嵌套对象(不是在这种情况下,因为这是字符串)被引用而不被复制。