簡體   English   中英

JavaScript:分配給數組中的對象會更改數組中所有對象的值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM