2013-07-25 66 views
0

我有一個對象有一個數組來保存這個對象的所有子對象,這些子對象也是同一對象的實例(我需要本作的樹形結構,其中的對象是樹的節點)JavaScript:賦值給一個數組中的對象改變數組中所有對象的值

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(); 

問題我s,而不是得到11個對象,他們每個人都有這些標誌之一[0,0,0,0,0,0,0,0,0,0,1]我得到11個對象,他們都有標誌1, (最後一個)!

請問你看看有什麼問題!

感謝

+1

我期望'this(new bugObject(kddFlag));'成爲問題。 – Ian

+0

嗨,感謝您的回覆,我重構了代碼在這裏發佈並放錯版本,請再看一下! – MedAli

回答

4

問題是這樣的:

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) 
      ); 
+0

嗨,感謝您的回答,你的意思是我必須做一些像var kddFlag併爲每個新對象創建一個新的kddFlag? – MedAli

+0

@Mohamed Ali Jamaoui:是的,檢查我的更新答案。 –

2

這是分配對象引用的問題,這是衆所周知的,甚至在其他語言中也是如此。

我給你一個簡單的例子:

比方說,你想要一個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(),它可以製作淺層副本,以解決一層或深層副本的問題。

相關問題