連結対象IDと同じ2つの配列オブジェクト
1029 ワード
var arr2=[{id:1,name:'23'}]
var arr1=[{id:1,car:'car2'}]
const combined = arr2.reduce((acc, cur) => {
const target = acc.find(e => e.id === cur.id);
console.log(target)
if (target) {
Object.assign(target, cur);
} else {
acc.push(cur);
}
return acc;
}, arr1);
参考資料:reduce方法の使用arr.2 reduce(function(acc,cur),arr 1):reduce方法が導入した関数の最初のパラメータaccは配列要素の累積値であり、reduce方法の第2のパラメータarr 1は累積値accを指定する初期値である.
ですから、最初のaccの値はarr 1で、curの値はarr 2[0]です.
const target=acc.find(e=>e.id==cur.id)targetはarr 1でidとarr 2[0].idの値が同じオブジェクトを返します.すなわち、{id:1,name:'23'}
例えば、var target={id:1}、{id:2}.find(e=>e.id==1)/targetの値は{id:1}である.
Object.assign/curの値をtargetにコピーし、同じ属性であれば上書きし、異なる属性であれば追加します.
参考資料:Object.assign
例えば、Object.assign({id:1,name:'23')、{id:1,car:'car 1')//結果として対象を得ることができます.
上のif...else...文の意味は、arr 1配列において、arr 2配列の要素と同じidを見つけた場合、結合して、arr 2配列のこの元素pushからarr 1配列の中に、最後に得られたaccおよびarr 1とarr 2を結合した配列を見つけられないということです.