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

編集:私は今、オブジェクトを理解 は、配列の参照として保存されます。あなたは、それが唯一の「プッシュ」配列へのobjectだとき

"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

:これを回避する1つの方法は、しかし下に示唆したように、これは次のようなループで達成することができる方法を項目ごとにオブジェクトを宣言することです参照をオブジェクトのコピーではなくプッシュします。

上記のコードでは、存在するのは1つだけですobjectです。 "チキン"のあなたのラインでは、単に文字列 "牛"を上書きしています。

私は示唆している:

100%正確である
var array = [] 
array.push({animal: "cow"}) 
array.push({animal: "chicken"}) 
+0

何エディットあたりとしてループのシナリオではどうですか? – Dercni

+0

"var object = {}"行をループ内に移動します。 – ash

1


これはメモリが内部的に動作する方法と関係があります。 PHPのように、値ではなく参照によって動作します。

使用すると、1つの文字列「牛」と「チキン」が1を含む配列で2つのオブジェクトを持っているしたいのであれば、あなたは2の1の操作を行うことができます

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

オブジェクトへの参照を配列にプッシュしています。あなたが終わるのは、同じオブジェクトへの2つの参照です。オブジェクトのプロパティを変更すると、そのオブジェクトへのすべての参照に影響します。

あなたが使用できるオブジェクトをコピーする必要がある場合:

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

console.log(array) 
関連する問題