Bagaimana cara mengkloning / menyalin peta di JavaScript?
Saya tahu cara mengkloning array tetapi bagaimana cara mengkloning / menyalin peta?
var myArray = new Array(1, 2, 3);
var copy = myArray.slice();
// now I can change myArray[0] = 5; & it wont affect copy array
// Can I just do the same for map?
var myMap = new ?? // in javascript is it called a map?
var myMap = {"1": 1, "2", 2};
var copy = myMap.slice();
javascript
sazr
sumber
sumber
let copy = {...myMap};
Jawaban:
Cara sederhana (untuk melakukan salinan dangkal) adalah dengan menyalin setiap properti peta sumber ke peta target:
var newMap = {}; for (var i in myMap) newMap[i] = myMap[i];
sumber
Dengan pengenalan Maps di JavaScript, itu cukup sederhana mengingat konstruktor menerima iterable:
var newMap = new Map(existingMap)
Dokumentasi di sini: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
sumber
Map.prototype.entries
danMap.prototype.set
. Artinya: Jika Anda menulis kelas yang memperluas Map dan menimpa salah satu dari dua metode ini, maka hanya menulisnew ExtendedMap( extendedMapObj )
tidak akan berfungsi jika metode yang diperluas bergantung pada properti yang tidak tersedia untuk super.var newMap = new Map(existingMap)
adalah diO(n)
manan
jumlah pasangan kunci / nilai peta? Saya kira operasi kloning tidak konstanO(1)
jika, seperti yang Anda katakan,Map.prototype.entries
dipanggil di bawah tenda ...Sangat mudah untuk mengkloning peta karena yang Anda bicarakan hanyalah sebuah objek. Ada
Map
di ES6 yang harus Anda cari, tetapi untuk menyalin objek, gunakan sajaObject.assign()
let map = {"a": 1, "b": 2} let copy = Object.assign({}, map);
Anda juga dapat menggunakan
cloneDeep()
dari Lodashlet copy = cloneDeep(map);
sumber
Object.assign
Peringatan untuk Deep Clone: "Jika nilai sumber adalah referensi ke objek, itu hanya menyalin nilai referensi."JQuery memiliki metode untuk memperluas suatu objek (menggabungkan dua objek), tetapi metode ini juga dapat digunakan untuk mengkloning suatu objek dengan menyediakan objek kosong.
// Shallow copy var newObject = jQuery.extend({}, oldObject); // Deep copy var newObject = jQuery.extend(true, {}, oldObject);
Informasi lebih lanjut dapat ditemukan di dokumentasi jQuery .
sumber
Tidak ada yang terintegrasi.
Gunakan mesin fotokopi properti rekursif yang telah teruji dengan baik atau jika performa tidak menjadi masalah, buat serial ke JSON dan parsing lagi ke objek baru.
sumber
Tidak ada klon / salin bawaan. Anda dapat menulis metode Anda sendiri ke salinan dangkal atau dalam:
function shallowCopy(obj) { var result = {}; for (var i in obj) { result[i] = obj[i]; } return result; } function deepCopy(obj) { var result = {}; for (var i in obj) { // recursion here, though you'll need some non-trivial logic // to avoid getting into an endless loop. } return result; }
Semua objek di Javascript bersifat dinamis, dan dapat diberi properti baru. Sebuah "peta" yang Anda rujuk sebenarnya hanyalah sebuah benda kosong. Array juga merupakan objek, dengan metode seperti
slice
dan properti sepertilength
.sumber
Jika Anda perlu membuat salinan dalam dari Peta, Anda dapat menggunakan yang berikut ini:
new Map(JSON.parse(JSON.stringify(Array.from(source))));
Dimana
source
objek Map asli.Perhatikan ini mungkin tidak cocok untuk semua kasus penggunaan di mana nilai Peta tidak dapat diserialkan, untuk lebih jelasnya lihat: https://stackoverflow.com/a/122704/10583071
sumber
deep copy
targetMap
itu hanya ashallow copy
. Mungkin ini sebabnya begitu cepat?Saya perhatikan bahwa Map harus memerlukan perlakuan khusus, jadi dengan semua saran di utas ini, kode akan menjadi:
function deepClone( obj ) { if( !obj || true == obj ) //this also handles boolean as true and false return obj; var objType = typeof( obj ); if( "number" == objType || "string" == objType ) // add your immutables here return obj; var result = Array.isArray( obj ) ? [] : !obj.constructor ? {} : new obj.constructor(); if( obj instanceof Map ) for( var key of obj.keys() ) result.set( key, deepClone( obj.get( key ) ) ); for( var key in obj ) if( obj.hasOwnProperty( key ) ) result[key] = deepClone( obj[ key ] ); return result; }
sumber
Cara baru dan elegan untuk melakukan ini:
var map1 = {"a": "b"}; var map2 = {...map1};
sumber