当我尝试在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
答案 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
请注意,正如您在此处所读到的,嵌套对象(不是在这种情况下,因为这是字符串)被引用而不被复制。