Googling untuk "objek klon javascript" membawa beberapa hasil yang sangat aneh, beberapa dari mereka sudah ketinggalan zaman dan ada yang terlalu kompleks, bukan semudah hanya:
let clone = {...original};
Apakah ada yang salah dengan ini?
javascript
ecmascript-6
javascript-objects
Dmitry Fadeev
sumber
sumber
original = { a: [1,2,3] }
memberi Anda klon denganclone.a
makhlukoriginal.a
. Modifikasi melalui salah satuclone
atauoriginal
memodifikasi hal yang sama , jadi tidak, ini buruk =)Jawaban:
Ini bagus untuk kloning dangkal . The objek spread adalah bagian standar dari ECMAScript 2018 .
Untuk kloning yang mendalam Anda akan membutuhkan solusi yang berbeda .
const clone = {...original}
untuk mengkloning dangkalconst newobj = {...original, prop: newOne}
untuk secara abadi menambahkan penyangga lain ke dokumen asli dan menyimpannya sebagai objek baru.sumber
JSON.parse(JSON.stringify(input))
JSON.parse(JSON.stringify(input))
tidak akan berfungsi, karena jika adafunctions
atauinfinity
sebagai nilai, itu hanya akan menetapkannull
di tempat mereka. Ini hanya akan berfungsi jika nilainya sederhanaliterals
dan tidakfunctions
.EDIT: Ketika jawaban ini diposting,
{...obj}
sintaksis tidak tersedia di sebagian besar browser. Saat ini, Anda harus baik-baik saja menggunakannya (kecuali Anda perlu mendukung IE 11).Gunakan Object.assign.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
Namun, ini tidak akan membuat klon yang dalam. Sampai sekarang belum ada cara kloning yang dalam.
EDIT: Seperti @Mike 'Pomax' Kamermans yang disebutkan dalam komentar, Anda dapat mengkloning objek sederhana (mis. Tidak ada prototipe, fungsi atau referensi melingkar) menggunakan
JSON.parse(JSON.stringify(input))
sumber
JSON.parse(JSON.stringify(input))
ini adalah klon mendalam yang tepat. Namun, saat prototipe, fungsi atau referensi melingkar sedang dimainkan, solusi itu tidak lagi berfungsi.Jika metode yang Anda gunakan tidak berfungsi dengan baik dengan objek yang melibatkan tipe data seperti Tanggal , coba ini
Impor
_
Objek klon yang dalam
sumber
import _ from 'lodash';
sudah cukup. Namun +1 untuk jawaban "jangan menemukan kembali roda".jika Anda tidak ingin menggunakan json.parse (json.stringify (objek)), Anda dapat membuat salinan nilai kunci secara rekursif:
Tetapi cara terbaik adalah membuat kelas yang dapat mengembalikan klon sendiri
sumber
Mengikuti dari jawaban oleh @marcel saya menemukan beberapa fungsi masih hilang pada objek yang dikloning. misalnya
dimana pada MyObject saya bisa mengkloning methodA tetapi methodB tidak termasuk. Ini terjadi karena tidak ada
yang berarti tidak muncul di
Sebaliknya saya beralih ke
yang akan menyertakan kunci yang tidak dapat dihitung.
Saya juga menemukan bahwa prototipe ( proto ) tidak dikloning. Untuk itu saya akhirnya menggunakan
PS: Frustasi saya tidak bisa menemukan fungsi bawaan untuk melakukan ini.
sumber
Anda bisa melakukannya seperti ini juga,
sumber
Tapi Object.assign () tidak membuat klon yang dalam
Untuk memperbaikinya, kita harus menggunakan loop kloning yang memeriksa setiap nilai pengguna [kunci] dan, jika itu adalah objek, kemudian mereplikasi strukturnya juga. Itu disebut "kloning dalam".
Ada algoritma standar untuk kloning mendalam yang menangani kasus di atas dan kasus yang lebih kompleks, yang disebut algoritma kloning terstruktur . Agar tidak menemukan kembali roda, kita dapat menggunakan implementasi yang berfungsi dari perpustakaan JavaScript lodash metode ini disebut _.cloneDeep (obj) .
sumber
Semua metode di atas tidak menangani kloning objek yang dalam di mana ia bersarang ke level n. Saya tidak memeriksa kinerjanya dibandingkan yang lain tetapi pendek dan sederhana.
Contoh pertama di bawah ini menunjukkan objek kloning menggunakan
Object.assign
klon mana saja sampai tingkat pertama.Menggunakan pendekatan di bawah ini objek klon dalam
sumber