在JS数组中更改单个对象会更改所有元素

时间:2016-03-02 02:06:00

标签: javascript arrays angularjs

我有一个包含71个对象的数组:

var data = []

我使用来自数据库的数据填充此数据,该数据库包含填充data的对象的静态和动态元素。

angular.forEach(returnData,function(value,index) {
  if(!Array.isArray(value)) {
    tempObject[key] = value;
  }
});
for(i = 0; i < 71; i++) {
  data.push(tempObject);
}

因此,在角度中,我从返回数据中获取静态的每个元素,创建它的对象,并重复该对象71次。所以数据可能会像这样开始:

[
  {'a': 1,
   'b': 2,
   'd': 7
  },
  {'a': 1,
   'b': 2,
   'd': 7
  }
]

然后我去抓取作为数组传回的所有元素,并尝试将它们添加到data数组中。

但是,只要我添加第一个元素,它就会为数组中的每个对象设置相同的元素。

意味着data[0]['c'] = 11;将导致:

[
  {'a': 1,
   'b': 2,
   'c': 11,
   'd': 7
  },
  {'a': 1,
   'b': 2,
   'c': 11,
   'd': 7
  }
]

即使我没有触及数组中的第二个索引。当我更新第二个索引时,它也会更新第一个索引。我确信这里有一些我不知道的东西。

谢谢!

2 个答案:

答案 0 :(得分:1)

您只是将对tempObject的引用推送到data数组中的71个不同位置。因此,data[0]data[1]等都指向同一个对象,这就是为什么您会看到更改反映在整个数组中的原因。

如果您想实际推送71个单独的实例,则每次将其推送到阵列时都必须克隆tempObject

最后我检查过,克隆普通旧JavaScript对象的最有效方法是string-ify然后重新解析:

data.push(JSON.parse(JSON.stringify(tempObject)));

答案 1 :(得分:1)

你自己说过:数组包含71次相同的对象。不是71个对象的副本,但是相同的单个对象引用了71次。因此,通过任何这些引用更改该对象将反映在所有引用中。