[英]JavaScript: assignment to an object within an array changes the value of all objects in the array
我有一個對象,該對象具有一個數組來容納該對象的所有子對象,這些子對象也是同一對象的實例(我需要一個像樹一樣的結構,其中該對象是樹的節點)
var bugObject = function(kFlag){
this._kFlag = kFlag;
this._children = []
}
bugObject.prototype.getKFlag = function(){
return this._kFlag;
};
bugObject.prototype.setChildrenFromData = function(data){
var i = 0;
var kFlag = {flagType : 'someFlag', flagValue : -1};
kddFlag.flagType = data.flagType;
var len = data.flagValues.length;
for( i = 0 ; i < len ; i++){
kFlag.flagValue = data.flagValues[i];
this._children.push(
new bugObject(kFlag)
);
//this is just to print the children
for(j = 0; j<=i; j++){
console.log('child : ' + j + ' for test :' + i);
console.log(this._children[i].getKFlag());
}
console.log('--------------------');
}
};
想法是使用setChildrenFromData方法基於一些數據創建此對象的子級,這是我的操作方式:
function main(){
console.log('main is called');
var data = {"flagType":"someFlag","flagValues":[0,0,0,0,0,0,0,0,1,0,0]};
var rootNode = new bugObject(null);
rootNode.setChildrenFromData(data);
}
main();
問題是我沒有得到11個對象,每個對象都具有以下標志之一[0,0,0,0,0,0,0,0,0,0,1,1]我得到了11個對象,所有這些對象均具有標志1,(最后一個)!
請問出什么問題了!
謝謝
問題是這樣的:
for( i = 0 ; i < len ; i++){
kddFlag.flagValue = data.flagValues[i];
this._children.push(
new bugObject(kddFlag)
);
您正在創建11 bugObject
。 但是它們所有人都有this._kddFlag
指向同一個kddFlag
對象,在循環的kddFlag.flagValue
為1。要解決此問題,請將代碼移入循環。 像這樣:
for( i = 0 ; i < len ; i++){
var kddFlag = {flagType : 'outlier', flagValue : -1};
kddFlag.flagType = data.flagType;
kddFlag.flagValue = data.flagValues[i];
this._children.push(
new bugObject(kddFlag)
);
這是將引用分配給對象的問題,這是眾所周知的,甚至在其他語言中也會發生。
我給你一個簡單的例子:
假設您要一個3x3矩陣,建模為一個數組數組,並填充全為零的行。
您可能會想寫。
row = [0,0,0];
A = [];
for(j=0;j<3;++j) A[j] = row;
但是,如果您更改A[0][0] = 10;
然后看A[1][0]
,得到10
,而不是0
。
這是因為只有row
,並且A
所有元素都分配給它。
要更正Javascript中的這種模式,該對象每次都需要是一個新對象。 可以使用文字A[j]=[0,0,0]
來完成,也可以是A[j]=row.slice()
進行淺層復制以解決一個級別的問題,也可以進行深層復制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.