2017-01-05 115 views
0

我想存储一个对象数组,但是看起来在对象存储在数组中之后,对它的任何引用都会更改原始值。将对象存储在数组中将覆盖值

"use strict" 

var array = [] 
var object = {} 

object.animal = "Cow" 
array.push(object) 
object.animal = "Chicken" 
array.push(object) 

console.log(array) //[ { animal: 'Chicken' }, { animal: 'Chicken' } ] 

编辑: 我现在明白了对象存储在阵列中的引用。为了避免这种情况的一个方法是,建议如下但是怎么能这样在循环中实现申报对象为每个项目如以下几点:

"use strict" 

var array = [] 
var object = {} 
var people = ["Mike Brown", "John Brown", "Mary Sue"] 
var fname, sname 

people.forEach(function(person) { 
    [fname, sname] = person.split(" ") 
    object.name = person 
    object.fname = fname 
    object.sname = sname 
    array.push(object) 
}) 

回答

3

当你“推”的object到阵列中,这是唯一的将参考推送到对象,而不是它的副本。

所以在上面的代码中只存在1 object存在。在你的“鸡”行上,你只是简单地覆盖字符串“牛”。

我建议:

var array = [] 
array.push({animal: "cow"}) 
array.push({animal: "chicken"}) 
+0

怎么样在循环情景按编辑? – Dercni

+0

将“var object = {}”行移动到循环中。 – ash

1

是100%正确的。
这与内存在内部的工作方式有关。 它通过引用工作,而不是像价值一样,比如PHP。

所以,如果你想有一个地方包含字符串“牛”,一个用“鸡”在数组中2个对象,你可以做1 2:

var array = [] 
var cow = {animal: 'Cow'}; 
var chicken = {animal: 'Chicken'}; 
array.push(cow); 
array.push(chicken); 
// Reason I'm including this option is because now you can now also do this 
cow.farm = 'Kentucky farm'; 
chicken.eggsPerDay = 1.5; 

或更快的方式,但不一定更好

var array = []; 
array.push({animal: 'cow'}); 
array.push({animal: 'chicken'}); 
1

您正在将对象的引用推送到数组上。你最终得到的是两个对同一个对象的引用。当您更改对象的属性时,您正在影响对该对象的所有引用。

如果你需要复制一个对象,你可以使用:

object.animal = "Cow" 
array.push(Object.assign({}, object)) 
object.animal = "Chicken" 
array.push(Object.assign({}, object)) 

console.log(array)