ecmascript 6 - Bagaimana cara menggabungkan dua objek javascript bersama-sama di ES6+?
Saya muak & lelah selalu harus menulis kode seperti ini:
function shallowExtend(obj1,obj2){
var key;
for ( key in obj2 ) {
if ( obj2.hasOwnProperty(key) === false ) continue;
obj1[key] = obj2[key]
}
}
Atau jika saya tidak ingin menulis kodenya sendiri, gunakan pustaka yang sudah melakukannya. Pasti ES6+ akan datang untuk membantu ini dan memberi kita sesuatu seperti Object.prototype.extend(obj2...) atau Object.extend(obj1,obj2...)
Jadi apakah ES6+ menyediakan fungsionalitas seperti itu? Jika belum ada, apakah fungsionalitas seperti itu direncanakan? Jika tidak direncanakan, lalu mengapa tidak?
Jawaban #1
Anda akan dapat melakukan merge/extend/assign dangkal di ES6 dengan menggunakan Object.assign:
https://developer.mozilla.org/id/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
Sintaks:
Object.assign(target, sources);
di mana ...sources mewakili objek sumber.
Contoh:
var obj1 = {name: 'Daisy', age: 30};
var obj2 = {name: 'Casey'};
Object.assign(obj1, obj2);
console.log(obj1.name === 'Casey' && obj1.age === 30);
// true
Jawaban #2
Anda dapat menggunakan sintaks penyebaran objek untuk ini:
const merged = {...obj1, ...obj2}
Untuk array, operator spread sudah menjadi bagian dari ES6 (ES2015), tetapi untuk objek ditambahkan ke spesifikasi bahasa pada ES9 (ES2018). Proposalnya telah diaktifkan secara default di alat-alat seperti Babel jauh sebelumnya.
Jawaban #3
Saya tahu ini adalah masalah yang agak lama, tetapi solusi termudah di ES2015/ES6 sebenarnya cukup sederhana, menggunakan Object.assign(),
Semoga ini membantu, ini juga melakukan penggabungan DEEP:
/**
* Simple is object check.
* @param item
* @returns {boolean}
*/
export function isObject(item) {
return (item && typeof item === 'object' && !Array.isArray(item) && item !== null);
}
/**
* Deep merge two objects.
* @param target
* @param source
*/
export function mergeDeep(target, source) {
if (isObject(target) && isObject(source)) {
for (const key in source) {
if (isObject(source[key])) {
if (!target[key]) Object.assign(target, { [key]: {} });
mergeDeep(target[key], source[key]);
} else {
Object.assign(target, { [key]: source[key] });
}
}
}
return target;
}
Contoh penggunaan:
mergeDeep(this, { a: { b: { c: 123 } } });
// or
const merged = mergeDeep({a: 1}, { b : { c: { d: { e: 12345}}}});
console.dir(merged); // { a: 1, b: { c: { d: [Object] } } }
