0

我有一个对象,它有一个数组来保存这个对象的所有孩子,孩子也是同一个对象的实例(我需要这个树状结构,其中对象是树的一个节点)

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] 我得到 11 个对象,它们都有标志1、(最后一个)!

你能看看有什么问题吗!

谢谢

4

2 回答 2

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)
            );
于 2013-07-25T14:09:21.420 回答
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()浅拷贝来解决一个级别的问题,也可以是深拷贝。

于 2013-07-25T14:21:01.777 回答