オブジェクトの結合
Object.assign()
を使うことにより、複数のオブジェクトをマージすることが出来ます。
書式
Object.assign(マージ先obj,マージ元obj1,マージ元obj2...);
第一引数にマージ先のオブジェクトを指定し、第ニ引数以降にマージ元となるオブジェクトを好きなだけ指定することができます。
js
//元となるオブジェクトを生成
let obj1 = {
name:`tamanegi`,
price:100
};
let obj2 = {
group:'vegetable',
from: 'japan'
};
let obj3 = {
market:'seiyu'
}
//オブジェクトをマージ
Object.assign(obj1,obj2,obj3);
//結果を出力
console.log(obj1);
実行結果
{ name: 'tamanegi',
price: 100,
group: 'vegetable',
from: 'japan',
market: 'seiyu' }
ただし、上記の例ではobj1
の元々の内容が失われてしまっています。
obj1
の元々の内容を保持しつつ、すべてをマージした別オブジェクトを生成するには以下のように記述します。
書式
let merged = Object.assign({},obj1,obj2,obj3);
第一引数に空のオブジェクトを指定し、第ニ引数以降にマージ元となるオブジェクトを指定します。
結果は
merged
に格納されます。js
//元となるオブジェクトを生成
let obj1 = {
name:`tamanegi`,
price:100
};
let obj2 = {
group:'vegetable',
from: 'japan'
};
let obj3 = {
market:'seiyu'
}
//オブジェクトをマージ
let merged = Object.assign({},obj1,obj2,obj3);
//結果を出力
console.log(obj1);
console.log(merged);
下記1行目がconsole.log(obj1)
の結果。3行目以降がconsole.log(merged)
の結果です。
実行結果
{ name: 'tamanegi', price: 100 }
{ name: 'tamanegi',
price: 100,
group: 'vegetable',
from: 'japan',
market: 'seiyu' }
これでobj1
の内容を保持しつつ、obj1
+obj2
+obj3
の内容をmerged
というオブジェクトにマージすることができました。
ディープコピーにはならないので注意が必要
js
//元となるオブジェクトを生成
let obj1 = {
name:`tamanegi`,
price:{num:100}
};
//オブジェクトをコピー
let newObj = Object.assign({},obj1);
//元のオブジェクトの値を書き換える。
obj1.name = 'hakusai';
obj1.price.num = 300;
//結果を出力
console.log(obj1);//{ name: 'hakusai', price: { num: 300 } }
console.log(newObj);//{ name: 'tamanegi', price: { num: 300 } }
解説
newObj
というオブジェクトにコピーした後に、obj1
の値を書き換えると、price
は参照型なのでnewObj
にも影響してしまうのです!ディープコピーする方法
コピー元のオブジェクトをJSON文字列に変換後、再度オブジェクトに戻すことで別オブジェクトになります。この別オブジェクトを用いることでディープコピーが可能になります。
書式
let newObj = Object.assign({}, JSON.parse(JSON.stringify(obj1)));
js
//元となるオブジェクトを生成
let obj1 = {
name:`tamanegi`,
price:{num:100}
};
//オブジェクトをコピー
let newObj = Object.assign({}, JSON.parse(JSON.stringify(obj1)));
//元のオブジェクトの値を書き換える。
obj1.name = 'hakusai';
obj1.price.num = 300;
//結果を出力
console.log(obj1);//{ name: 'hakusai', price: { num: 300 } }
console.log(newObj);//{ name: 'tamanegi', price: { num: 100 } }
これでnewObj
に影響しないことを確認できました。
以上で記事の解説はお終い!
HTML、CSS、JavaScriptをもっと勉強したい方にはUdemyがオススメ!同僚に差をつけよう!