Wie klone / kopiere ich eine Karte in JavaScript?
Ich weiß, wie man ein Array klont, aber wie klone / kopiere ich eine Karte?
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
quelle
quelle
let copy = {...myMap};
Antworten:
Eine einfache Möglichkeit (eine flache Kopie zu erstellen) besteht darin, jede Eigenschaft der Quellkarte auf die Zielkarte zu kopieren:
var newMap = {}; for (var i in myMap) newMap[i] = myMap[i];
quelle
Mit der Einführung von Maps in JavaScript ist es recht einfach, wenn man bedenkt, dass der Konstruktor eine Iterable akzeptiert:
var newMap = new Map(existingMap)
Dokumentation hier: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
quelle
Map.prototype.entries
und aufgerufenMap.prototype.set
. Das bedeutet: Wenn Sie eine Klasse schreiben, die Map erweitert und eine dieser beiden Methoden überschreibt,new ExtendedMap( extendedMapObj )
funktioniert das einfache Schreiben nicht, wenn die erweiterten Methoden auf Eigenschaften beruhen, die dem Super nicht zur Verfügung stehen.var newMap = new Map(existingMap)
ist,O(n)
won
die Anzahl der Schlüssel / Wert-Paare der Karte ist? Ich denke, dass derO(1)
Map.prototype.entries
Es ist sehr einfach, eine Karte zu klonen, da es sich bei dem, worüber Sie sprechen, nur um ein Objekt handelt. Es gibt eine
Map
in ES6, die Sie nachschlagen sollten, aber um ein Objekt zu kopieren, verwenden Sie einfachObject.assign()
let map = {"a": 1, "b": 2} let copy = Object.assign({}, map);
Sie können auch
cloneDeep()
von Lodash verwendenlet copy = cloneDeep(map);
quelle
Object.assign
Warnung für Deep Clone: "Wenn der Quellwert eine Referenz auf ein Objekt ist, wird nur der Referenzwert kopiert."JQuery verfügt über eine Methode zum Erweitern eines Objekts (Zusammenführen von zwei Objekten). Diese Methode kann jedoch auch zum Klonen eines Objekts verwendet werden, indem ein leeres Objekt bereitgestellt wird.
// Shallow copy var newObject = jQuery.extend({}, oldObject); // Deep copy var newObject = jQuery.extend(true, {}, oldObject);
Weitere Informationen finden Sie in der jQuery-Dokumentation .
quelle
Es ist nichts eingebaut.
Verwenden Sie entweder einen gut getesteten rekursiven Eigenschaftskopierer oder, wenn die Leistung kein Problem darstellt, serialisieren Sie in JSON und analysieren Sie erneut ein neues Objekt.
quelle
Es ist kein Klon / keine Kopie integriert. Sie können Ihre eigene Methode entweder in eine flache oder eine tiefe Kopie schreiben:
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; }
Alle Objekte in Javascript sind dynamisch und können neuen Eigenschaften zugewiesen werden. Eine "Karte", wie Sie sich darauf beziehen, ist eigentlich nur ein leeres Objekt. Ein Array ist auch ein Objekt mit Methoden wie
slice
und Eigenschaften wielength
.quelle
Wenn Sie eine tiefe Kopie einer Karte erstellen müssen, können Sie Folgendes verwenden:
new Map(JSON.parse(JSON.stringify(Array.from(source))));
Wo
source
ist das ursprüngliche Kartenobjekt?Beachten Sie, dass dies möglicherweise nicht für alle Anwendungsfälle geeignet ist, in denen die Kartenwerte nicht serialisierbar sind. Weitere Informationen finden Sie unter: https://stackoverflow.com/a/122704/10583071
quelle
deep copy
Ziel,Map
sondern nur einshallow copy
. Vielleicht ist es deshalb so schnell?Mir ist aufgefallen, dass Map eine besondere Behandlung erfordern sollte. Bei allen Vorschlägen in diesem Thread lautet der Code daher:
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; }
quelle
Eine neue und elegante Art, dies zu tun:
var map1 = {"a": "b"}; var map2 = {...map1};
quelle