Jak sklonować / skopiować mapę w JavaScript?
Wiem, jak sklonować tablicę, ale jak sklonować / skopiować mapę?
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
źródło
źródło
let copy = {...myMap};
Odpowiedzi:
Prostym sposobem (wykonanie płytkiej kopii) jest skopiowanie każdej właściwości mapy źródłowej do mapy docelowej:
var newMap = {}; for (var i in myMap) newMap[i] = myMap[i];
źródło
Wraz z wprowadzeniem Map w JavaScript jest to dość proste, biorąc pod uwagę, że konstruktor akceptuje iterowalne:
var newMap = new Map(existingMap)
Dokumentacja tutaj: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
źródło
Map.prototype.entries
iMap.prototype.set
. To znaczy: jeśli napiszesz klasę, która rozszerza Map i nadpisuje którąkolwiek z tych dwóch metod, to po prostu pisanienew ExtendedMap( extendedMapObj )
nie zadziała, jeśli metody rozszerzone opierają się na właściwościach, które nie są dostępne dla super.var newMap = new Map(existingMap)
jestO(n)
gdzien
jest liczba par klucz / wartość na mapie? Chyba operacja klonowania nie jest stała,O(1)
jeśli, jak mówisz,Map.prototype.entries
jest wywoływana pod maską ...Bardzo łatwo sklonować mapę, ponieważ to, o czym mówisz, to tylko obiekt. W
Map
ES6 jest znak , który powinieneś sprawdzić, ale aby skopiować obiekt, po prostu użyjObject.assign()
let map = {"a": 1, "b": 2} let copy = Object.assign({}, map);
Możesz również skorzystać
cloneDeep()
z Lodashlet copy = cloneDeep(map);
źródło
JQuery ma metodę rozszerzania obiektu (scalanie dwóch obiektów), ale ta metoda może być również używana do klonowania obiektu przez dostarczenie pustego obiektu.
// Shallow copy var newObject = jQuery.extend({}, oldObject); // Deep copy var newObject = jQuery.extend(true, {}, oldObject);
Więcej informacji można znaleźć w dokumentacji jQuery .
źródło
Nie ma nic wbudowanego.
Użyj dobrze przetestowanej rekurencyjnej kopiarki właściwości lub jeśli wydajność nie jest problemem, serializuj do JSON i ponownie przeanalizuj do nowego obiektu.
źródło
Nie ma wbudowanej funkcji klonowania / kopiowania. Możesz napisać własną metodę do płytkiej lub głębokiej kopii:
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; }
Wszystkie obiekty w Javascript są dynamiczne i można im przypisać nowe właściwości. „Mapa”, jak się do niej odnosisz, jest w rzeczywistości po prostu pustym obiektem. Array to także obiekt z metodami takimi jak
slice
i właściwościami, takimi jaklength
.źródło
Jeśli chcesz zrobić dokładną kopię mapy, możesz skorzystać z:
new Map(JSON.parse(JSON.stringify(Array.from(source))));
Gdzie
source
jest oryginalny obiekt mapy.Należy pamiętać, że może to nie być odpowiednie dla wszystkich przypadków użycia, w których wartości map nie są serializowane. Aby uzyskać więcej informacji, zobacz: https://stackoverflow.com/a/122704/10583071
źródło
deep copy
celuMap
, a po prostushallow copy
. Może dlatego jest tak szybki?Zauważyłem, że Mapa powinna wymagać specjalnego traktowania, dlatego przy wszystkich sugestiach w tym wątku kod będzie wyglądał następująco:
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; }
źródło
Nowy i elegancki sposób na to:
var map1 = {"a": "b"}; var map2 = {...map1};
źródło