Saya mencoba membuat metode peta salinan dalam untuk proyek Redux saya yang akan bekerja dengan objek daripada array. Saya membaca bahwa di Redux setiap negara bagian tidak boleh mengubah apa pun di negara bagian sebelumnya.
export const mapCopy = (object, callback) => {
return Object.keys(object).reduce(function (output, key) {
output[key] = callback.call(this, {...object[key]});
return output;
}, {});
}
Berhasil:
return mapCopy(state, e => {
if (e.id === action.id) {
e.title = 'new item';
}
return e;
})
Namun itu tidak menyalin item dalam jadi saya perlu mengubahnya menjadi:
export const mapCopy = (object, callback) => {
return Object.keys(object).reduce(function (output, key) {
let newObject = {...object[key]};
newObject.style = {...newObject.style};
newObject.data = {...newObject.data};
output[key] = callback.call(this, newObject);
return output;
}, {});
}
Ini kurang elegan karena perlu mengetahui objek mana yang dilewati. Apakah ada cara di ES6 untuk menggunakan sintaks penyebaran untuk menyalin objek secara mendalam?
combineReducers
untuk menyusun keduanya (atau lebih) bersama-sama. Jika Anda menggunakan teknik redux idiomatik, masalah objek kloning mendalam Anda akan hilang.Jawaban:
Tidak ada fungsi seperti itu yang ada di dalam ES6. Saya rasa Anda memiliki beberapa opsi tergantung pada apa yang ingin Anda lakukan.
Jika Anda benar-benar ingin menyalin lebih dalam:
cloneDeep
metode.Solusi Alternatif Untuk Masalah Khusus Anda (Tanpa Salinan Dalam)
Namun, menurut saya, jika Anda bersedia mengubah beberapa hal, Anda dapat menghemat beberapa pekerjaan. Saya berasumsi bahwa Anda mengontrol semua situs panggilan ke fungsi Anda.
Tentukan bahwa semua callback yang diteruskan
mapCopy
harus mengembalikan objek baru alih-alih memutasi objek yang sudah ada. Sebagai contoh:Ini menggunakan
Object.assign
untuk membuat objek baru, menyetel propertie
pada objek baru itu, lalu menyetel judul baru pada objek baru itu. Ini berarti Anda tidak pernah mengubah objek yang ada dan hanya membuat yang baru jika diperlukan.mapCopy
bisa sangat sederhana sekarang:Intinya,
mapCopy
mempercayai pemanggilnya untuk melakukan hal yang benar. Inilah sebabnya saya mengatakan ini mengasumsikan Anda mengontrol semua situs panggilan.sumber
Sebagai gantinya gunakan ini untuk salinan dalam
sumber
Dari MDN
Secara pribadi, saya sarankan menggunakan fungsi cloneDeep Lodash untuk kloning objek / array multi-level.
Berikut adalah contoh yang berfungsi:
sumber
Run code snippet
dan seharusnya berjalan dengan benar.Saya sering menggunakan ini:
sumber
Menggunakan
JSON.stringify
danJSON.parse
merupakan cara terbaik. Karena dengan menggunakan operator spread kita tidak akan mendapatkan jawaban yang efisien jika objek json berisi objek lain di dalamnya. kita perlu menentukannya secara manual.sumber
sumber
sumber
sumber
Saya sendiri mendapatkan jawaban ini hari lalu, mencoba menemukan cara untuk menyalin struktur kompleks secara mendalam, yang mungkin termasuk tautan rekursif. Karena saya tidak puas dengan apa pun yang disarankan sebelumnya, saya menerapkan roda ini sendiri. Dan itu bekerja dengan cukup baik. Semoga bisa membantu seseorang.
Contoh penggunaan:
Silakan lihat di https://github.com/latitov/JS_DeepCopy untuk contoh langsung bagaimana menggunakannya, dan juga deep_print () ada di sana.
Jika Anda membutuhkannya dengan cepat, inilah sumber fungsi deep_copy ():
Bersulang@!
sumber
Inilah algoritma deep copy saya.
sumber
Berikut adalah fungsi deepClone yang menangani semua tipe data primitif, larik, objek, fungsi
sumber