2017-01-05 2 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' } ] 

Edit: теперь я понимаю, объекты сохраняются в виде ссылок в массиве. Один из способов избежать этого является объявить объект для каждого элемента, как предлагается ниже, однако, как это может быть достигнуто в цикле, такие как:

"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) 
Смежные вопросы