Saya harus dapat menggabungkan dua objek JavaScript (sangat sederhana) saat runtime. Misalnya saya ingin:
var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog' }
obj1.merge(obj2);
//obj1 now has three properties: food, car, and animal
Apakah ada yang punya skrip untuk ini atau mengetahui cara yang dibangun untuk melakukan ini? Saya tidak perlu rekursi, dan saya tidak perlu menggabungkan fungsi, hanya metode pada objek datar.
javascript
javascript-objects
JC Grubbs
sumber
sumber
var obj2 = { animal: 'dog', food: 'bone' };
, gabungannya akan{ food: 'bone', car: 'ford', animal: 'dog' }
. Jika Anda bekerja dengan "data bersarang", dan menginginkan "penggabungan dalam", maka cari jawaban yang menyebutkan "penggabungan dalam" atau "rekursi". Jika Anda memiliki nilai-nilai ituarrays
, maka gunakan opsi "arrayMerge" dari github "TehShrike / deepmerge", seperti yang disebutkan di sini .Jawaban:
ECMAScript 2018 Metode Standar
Anda akan menggunakan penyebaran objek :
merged
sekarang penyatuanobj1
danobj2
. Properti diobj2
akan menimpa mereka diobj1
.Berikut ini juga dokumentasi MDN untuk sintaks ini. Jika Anda menggunakan babel, Anda membutuhkan plugin babel-plugin-transform-object-rest-spread agar bisa berfungsi.
ECMAScript 2015 (ES6) Metode Standar
(lihat Referensi JavaScript MDN )
Metode untuk ES5 dan Sebelumnya
Perhatikan bahwa ini hanya akan menambahkan semua atribut
obj2
untukobj1
yang tidak mungkin apa yang Anda inginkan jika Anda masih ingin menggunakan dimodifikasiobj1
.Jika Anda menggunakan kerangka kerja yang hancur di seluruh prototipe Anda maka Anda harus lebih suka dengan cek suka
hasOwnProperty
, tetapi kode itu akan bekerja untuk 99% kasus.Fungsi contoh:
sumber
var merged = {...obj1, ...obj2}
.{...obj1, ...{animal: 'dog'}}
jQuery juga memiliki utilitas untuk ini: http://api.jquery.com/jQuery.extend/ .
Diambil dari dokumentasi jQuery:
Kode di atas akan mengubah nama objek yang ada
settings
.Jika Anda ingin membuat objek baru tanpa mengubah argumen, gunakan ini:
sumber
jQuery.extend(true,settings,override)
, Yang penting jika properti di pengaturan memegang objek dan menimpa hanya memiliki bagian dari objek itu. Alih-alih menghapus properti yang tidak cocok, pengaturan yang dalam hanya akan memperbarui di mana ada. Nilai defaultnya salah.The Harmony ECMAScript 2015 (ES6) menspesifikasikan
Object.assign
yang akan melakukan hal ini.Dukungan browser saat ini menjadi lebih baik , tetapi jika Anda sedang mengembangkan untuk browser yang tidak memiliki dukungan, Anda dapat menggunakan polyfill .
sumber
Object.assign
memiliki cakupan yang cukup baik: kangax.github.io/compat-table/es6/…Object.assign({}, obj1, obj2)
Saya mencari kode untuk menggabungkan properti objek dan berakhir di sini. Namun karena tidak ada kode untuk penggabungan rekursif saya menulis sendiri. (Mungkin perpanjangan jQuery adalah BTW rekursif?) Bagaimanapun, mudah-mudahan orang lain akan merasakan manfaatnya juga.
(Sekarang kode tidak digunakan
Object.prototype
:)Kode
Sebuah contoh
Menghasilkan objek seperti o3
sumber
Perhatikan bahwa
underscore.js
's -extend
metode melakukan ini dalam satu baris:sumber
_({}).extend(obj1, obj2);
_.defaults(object, *defaults)
"Isi properti null dan undefined dalam objek dengan nilai-nilai dari objek default, dan kembalikan objek."var mergedObj = _.extend({}, obj1, obj2)
.Mirip dengan jQuery ext (), Anda memiliki fungsi yang sama di AngularJS :
sumber
Saya perlu menggabungkan objek hari ini, dan pertanyaan ini (dan jawaban) banyak membantu saya. Saya mencoba beberapa jawaban, tetapi tidak ada yang sesuai dengan kebutuhan saya, jadi saya menggabungkan beberapa jawaban, menambahkan sesuatu sendiri dan muncul dengan fungsi gabungan baru. Ini dia:
Beberapa contoh penggunaan:
sumber
merge({}, t1, { key1: 1 })
?Anda dapat menggunakan properti penyebaran objek — saat ini proposal ECMAScript tahap 3.
sumber
Solusi yang diberikan harus diubah untuk memeriksa
source.hasOwnProperty(property)
dalamfor..in
loop sebelum menugaskan - jika tidak, Anda berakhir menyalin properti dari seluruh rantai prototipe, yang jarang diinginkan ...sumber
Menggabungkan properti objek N dalam satu baris kode
Sebuah
Object.assign
metode adalah bagian dari 2015 standar ECMAScript (ES6) dan melakukan apa yang Anda butuhkan. (IE
tidak didukung)Baca lebih banyak...
The polyfill untuk mendukung browser lama:
sumber
Objects.assign
mengembalikan objek gabungan yang jawaban lainnya tidak. Itu gaya pemrograman yang lebih fungsional.Dua berikut ini mungkin merupakan titik awal yang baik. lodash juga memiliki fungsi penyesuai untuk kebutuhan khusus tersebut!
_.extend
( http://underscorejs.org/#extend )_.merge
( https://lodash.com/docs#merge )sumber
Omong-omong, apa yang Anda semua lakukan adalah menimpa properti, bukan menggabungkan ...
Ini adalah bagaimana area objek JavaScript benar-benar digabungkan: Hanya kunci dalam
to
objek yang bukan objek itu sendiri yang akan ditimpa olehfrom
. Yang lainnya akan benar - benar digabungkan . Tentu saja Anda dapat mengubah perilaku ini untuk tidak menimpa apa pun yang hanya ada jikato[n] is undefined
, dll ...:Pemakaian:
sumber
Inilah tikaman saya yang mana
Pendek :)
Contoh:
sumber
{}
sebagai parameter pertama atau memiliki fungsi memodifikasi objek asli. Oleh karena itu jika Anda mengubahdst = {}
untukdst = arguments[0]
itu akan mengubah objek pertama Anda lulus ke objek digabungtoString.call(src) == '[object Object]'
untuk memeriksa apakah ada objek atau tidak.typeof src
jauh lebih baik. Selain itu mengubah Array menjadi objek (Setidaknya saya punya perilaku seperti pada chrome terbaru).Object.assign ()
ECMAScript 2015 (ES6)
Ini adalah teknologi baru, bagian dari standar ECMAScript 2015 (ES6). Spesifikasi teknologi ini telah diselesaikan, tetapi periksa tabel kompatibilitas untuk penggunaan dan status implementasi di berbagai browser.
Metode Object.assign () digunakan untuk menyalin nilai-nilai semua properti enumerable sendiri dari satu atau lebih objek sumber ke objek target. Ini akan mengembalikan objek target.
sumber
Untuk objek yang tidak terlalu rumit, Anda bisa menggunakan JSON :
Harap diingat bahwa dalam contoh ini "} {" tidak boleh muncul dalam string!
sumber
var so1 = JSON.stringify(obj1); var so2 = JSON.stringify(obj1); objMerge = so1.substr(0, so1.length-1)+","+so2.substr(1); console.info(objMerge);
function merge(obj1, obj2) { return JSON.parse((JSON.stringify(obj1) + JSON.stringify(obj2)) .replace(/\}\{/g, ',').replace(/,\}/g, '}').replace(/\{,/g, '{')); }
objMerge = JSON.parse((JSON.stringify(obj1) + JSON.stringify(obj2)).replace(/\}\{/, ", "));
Ada sebuah perpustakaan yang disebut
deepmerge
di GitHub : Itu tampaknya akan mendapatkan beberapa traksi. Ini adalah mandiri, tersedia melalui npm dan manajer paket bower .Saya akan cenderung menggunakan atau memperbaiki kode ini daripada menyalin-menempelkan kode dari jawaban.
sumber
Cara terbaik bagi Anda untuk melakukan ini adalah menambahkan properti yang tepat yang tidak dapat dihitung menggunakan Object.defineProperty.
Dengan cara ini Anda masih akan dapat beralih di atas properti objek Anda tanpa memiliki "perluasan" yang baru dibuat yang akan Anda dapatkan jika Anda membuat properti dengan Object.prototype.extend.
Semoga ini membantu:
Setelah Anda berhasil, Anda dapat melakukan:
Saya baru saja menulis posting blog di sini: http://onemoredigit.com/post/1527191998/extending-objects-in-node-js
sumber
Anda cukup menggunakan jQuery
extend
Sekarang
obj1
berisi semua nilaiobj1
danobj2
sumber
jQuery.extend( target [, object1 ] [, objectN ] )
Prototipe memiliki ini:
obj1.extend(obj2)
akan melakukan apa yang Anda inginkan.sumber
Object.prototype
dan tidakObject
... Ide bagus atau tidak, ini adalah apa yang dilakukanprototype.js
kerangka kerja, dan jadi jika Anda menggunakannya atau kerangka kerja lain yang bergantung padanya,Object.prototype
sudah akan diperluasextend
.Object.prototype
?Object.extend
tidak akan mengganggu objek Anda, itu hanya melampirkan fungsi keObject
objek. Danobj1.extend(obj2)
bukan cara yang benar untuk menjalankan fungsi, gunakanObject.extend(obj1, obj2)
insted** Objek penggabungan mudah digunakan
Object.assign
atau...
operator spread **Objek digabung dari kanan ke kiri, ini berarti bahwa objek yang memiliki properti identik sebagai objek di sebelah kanannya akan ditimpa.
Dalam contoh ini
obj2.car
menimpaobj1.car
sumber
Hanya jika ada yang menggunakan Perpustakaan Penutupan Google :
Fungsi pembantu serupa ada untuk array :
sumber
Saya memperpanjang metode David Coallier:
Jika override salah, tidak ada properti yang akan ditimpa tetapi properti baru akan ditambahkan.
Penggunaan: obj.merge (gabungan ... [, ganti]];
Ini kode saya:
Contoh dan TestCases:
Metode equals saya dapat ditemukan di sini: Perbandingan objek dalam JavaScript
sumber
Di Mootools , ada Object.merge () :
sumber
Dalam Ext JS 4 dapat dilakukan sebagai berikut:
Lihat gabungan (objek): Objek .
sumber
Wow .. ini adalah posting StackOverflow pertama yang saya lihat dengan beberapa halaman. Permintaan maaf karena menambahkan "jawaban" lainnya
Metode ini untuk ES5 & Sebelumnya - ada banyak jawaban lain yang membahas ES6.
Saya tidak melihat objek "dalam" yang menyatu menggunakan
arguments
properti. Inilah jawaban saya - ringkas & rekursif , yang memungkinkan argumen objek tak terbatas dilewatkan:Bagian yang dikomentari adalah opsional .. itu hanya akan melewati argumen yang dilewati yang bukan objek (mencegah kesalahan).
Contoh:
sumber
Menggunakan jQuery.extend () - Tautan
Menggunakan _.merge () - Tautan
Menggunakan _.extend () - Tautan
Menggunakan Object.assign () ECMAScript 2015 (ES6) - Tautan
Keluaran semua
sumber
Berdasarkan jawaban Markus ' dan vsync' , ini adalah versi yang diperluas. Fungsi ini mengambil sejumlah argumen. Ini dapat digunakan untuk mengatur properti node DOM dan membuat salinan nilai yang dalam. Namun, argumen pertama diberikan sebagai referensi.
Untuk mendeteksi simpul DOM, fungsi isDOMNode () digunakan (lihat pertanyaan Stack Overflow JavaScript isDOM - Bagaimana Anda memeriksa apakah Obyek JavaScript adalah Obyek DOM? )
Itu diuji di Opera 11, Firefox 6, Internet Explorer 8 dan Google Chrome 16.
Kode
Beberapa contoh
Tetapkan innerHTML dan gaya Elemen HTML
Gabungkan array dan objek. Perhatikan bahwa undefined dapat digunakan untuk mempertahankan nilai dalam lefthand array / object.
Argumen apa pun yang tidak menjadi objek JavaScript (termasuk nol) akan diabaikan. Kecuali untuk argumen pertama, node DOM juga dibuang. Waspadalah bahwa string yaitu, dibuat seperti String baru () sebenarnya adalah objek.
Jika Anda ingin menggabungkan dua objek menjadi yang baru (tanpa memengaruhi salah satu dari keduanya) berikan {} sebagai argumen pertama
Edit (oleh ReaperSoon):
Untuk juga menggabungkan array
sumber
sumber
Anda harus menggunakan lodash's defaultseep
sumber
Dengan Underscore.js , untuk menggabungkan berbagai objek, lakukan:
Ini menghasilkan:
sumber