Diberikan objek:
var firstObject = {
key1 : 'value1',
key2 : 'value2'
};
bagaimana cara menyalin properti di dalam objek lain ( secondObject
) seperti ini:
var secondObject = {
key1 : 'value1',
key2 : 'value2',
key3 : 'value3',
key4 : 'value4'
};
menggunakan referensi ke firstObject
? Sesuatu seperti ini:
var secondObject = {
firstObject,
key3 : 'value3',
key4 : 'value4'
};
(Ini tidak berfungsi ... Saya hanya menunjukkan pada garis besar bagaimana saya ingin menyusun kode).
Apakah solusi mungkin tanpa menggunakan kerangka kerja JavaScript?
javascript
Igor Popov
sumber
sumber
secondObject = JSON.parse('{' + JSON.stringify(firstObject).match(/^.(.*).$/)[1] + ',' + JSON.stringify(secondObject).match(/^.(.*).$/)[1] + '}');
Jawaban:
sumber
hasOwnProperty
tidak berguna. Sementara saya menemukan pointer Anda bermanfaat, saya menganggap gagasan menerapkan setiap aturan untuk setiap situasi yang berbahaya dan tidak bijaksana. Seperti semua praktik pengembangan berbasis pola yang sedang terjadi, jadi jangan menganggapnya pribadi ...hasOwnProperty()
tes dan hal-hal yang sepertinya terus bekerja. Sampai mereka berhenti, karena objek Anda menjadi lebih kompleks dari waktu ke waktu. Kecuali kemudian rusak secara misterius di bagian kode yang tidak terkait karena terlalu banyak disalin. Dan Anda tidak memiliki konteks untuk debugging. JS menyebalkan seperti itu, jadi pengkodean yang hati-hati untuk mencegah masalah seperti itu terjadi adalah bijaksana.Mengambil petunjuk dari jawaban @ Bardzuśny di sini, ES6 telah memberikan solusi asli:
Object.assign()
fungsinya!Penggunaannya sederhana:
Itu dia!
Dukungan saat ini jelas buruk; hanya Firefox (34+) yang mendukungnya, sementara Chrome (45+) dan Opera (32+) membutuhkan 'flag eksperimental' yang harus ditetapkan.Dukungan semakin membaik, dengan Chrome, Firefox, Opera, Safari, dan Edge versi terbaru mendukungnya (IE khususnya tidak memiliki dukungan.) Transpizer juga tersedia, seperti Babel dan Traceur. Lihat di sini untuk detail lebih lanjut.
sumber
Object.assign()
-hanya shim: github.com/ljharb/object.assign ).Per ES6 - Sebarkan sintaks :
Anda cukup menggunakan:
Ini menghindari masalah melewatkan benda-benda ini dengan referensi.
Selain itu merawat benda-benda yang memiliki sarang yang dalam.
sumber
Ulangi properti dari objek pertama dan tetapkan ke objek kedua, seperti ini:
The
for
-in
loop tidak cukup; kamu membutuhkanhasOwnProperty
. Lihat http://bonsaiden.github.com/JavaScript-Garden/#object.forinloop untuk penjelasan terperinci tentang alasannya.sumber
reference
dalam arti teknis. Saya pikir dia hanya berarti bahasa alami "merujuk ke".Bermain necromancer di sini, karena ES5 membawa kita
Object.keys()
, dengan potensi untuk menyelamatkan kita dari semua.hasOwnProperty()
cek ini .Atau, membungkusnya dalam suatu fungsi ("salinan" terbatas dari lodash
_.assign()
):Object.keys()
adalah metode yang relatif baru, terutama: tidak tersedia di IE <9. Hal yang sama juga berlaku untuk.forEach()
metode array, yang saya gunakan di tempat biasafor
loop .Untungnya ada es5-shim tersedia untuk browser kuno ini, yang akan mengisi banyak fitur ES5 (termasuk keduanya).
(Saya mendukung polyfill dan tidak menggunakan fitur bahasa baru yang keren.)
sumber
Necro'ing sehingga orang-orang dapat menemukan metode penyalinan yang dalam dengan hasOwnProperty dan pemeriksaan objek aktual:
sumber
'[object Array]'
Satu dapat menggunakan Object.assign untuk menggabungkan objek. Ini akan menggabungkan dan menimpa properti umum dari kanan ke kiri yaitu, properti yang sama di sebelah kiri akan ditimpa oleh kanan.
Dan penting untuk memasok objek kosong terlebih dahulu untuk menghindari mutasi objek sumber. Objek sumber harus dibiarkan bersih karena
Object.assign()
dengan sendirinya mengembalikan objek baru.Semoga ini membantu!
sumber
Peningkatan ide kingPuppy dan ide OP (salinan dangkal) - Saya hanya menambahkan 3 titik ke OP "contoh" :)
Tampilkan cuplikan kode
sumber
Ini harus bekerja, diuji di sini .
Catatan : ini tidak akan menyalin metode
firstObject
Catatan 2 : untuk digunakan di browser yang lebih lama, Anda akan memerlukan json parser
Catatan 3 : menetapkan dengan referensi adalah opsi yang layak, terutama jika
firstObject
berisi metode. Menyesuaikan contoh jsfiddle yang diberikan sesuaisumber
Sayangnya, Anda tidak dapat menempatkan referensi ke variabel di objek seperti itu. Namun, Anda bisa membuat fungsi yang menyalin nilai objek ke objek lain.
sumber
Jika Anda ingin mengambil hanya properti yang ada di objek kedua, Anda bisa menggunakan
Object.keys
untuk mengambil properti dari objek pertama, Anda bisa melakukan dua metode:A.)
map
untuk menetapkan properti objek pertama ke objek kedua menggunakan efek samping:B.) atau
reduce
untuk membuat objek baru dan menetapkannya ke objek kedua. Ketahuilah bahwa metode ini menggantikan properti lain yang mungkin dimiliki objek kedua sebelum yang tidak cocok dengan objek pertama:sumber
Gunakan notasi sebaran properti. Itu ditambahkan di ES2018 (spread untuk array / iterables sebelumnya, ES2015), {... firstObject} menyebar semua properti enumerable sebagai properti diskrit.
sumber
Saya lebih suka menggunakan firstObject sebagai prototipe dari secondObject, dan menambahkan deskriptor properti:
Ini tentu saja tidak satu-liner, tetapi memberi Anda lebih banyak kontrol. Jika Anda tertarik dengan deskriptor properti, saya sarankan untuk membaca artikel ini: http://patrickdelancy.com/2012/09/property-descriptors-in-javascript/#comment-2062 dan halaman MDN https: //developer.mozilla. org / id-AS / docs / Web / JavaScript / Referensi / Global_Objects / Obyek / buat
Anda juga bisa hanya memberikan nilai dan menghilangkan deskriptor dan membuatnya sedikit lebih pendek:
Kompatibilitas: ECMAScript 5, jadi IE9 +
sumber
Menggunakan metode follwing akan menyalin properti
Saya sangat baru dalam javascript, tetapi ternyata ini berfungsi. Agak terlalu lama kurasa, tapi itu berhasil.
sumber