繁体   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