Ich habe ein Objekt x
. Ich würde es gerne als Objekt kopieren y
, so dass Änderungen an y
nicht verändern x
. Ich habe festgestellt, dass das Kopieren von Objekten, die von integrierten JavaScript-Objekten abgeleitet sind, zu zusätzlichen, unerwünschten Eigenschaften führt. Das ist kein Problem, da ich eines meiner eigenen, wörtlich konstruierten Objekte kopiere.
Wie kann ich ein JavaScript-Objekt korrekt klonen?
35 Stimmen
Siehe diese Frage: stackoverflow.com/questions/122102/
0 Stimmen
Unterstützen Sie auf jeden Fall @Niyaz! Shortlink: tinyurl.com/JSCopyObject
290 Stimmen
Für JSON verwende ich
mObj=JSON.parse(JSON.stringify(jsonObject));
79 Stimmen
Ich verstehe wirklich nicht, warum niemand vorschlägt.
Object.create(o)
dass es alles tut, was der Autor verlangt?5 Stimmen
@froginvasion Wahrscheinlich, weil es im IE8 und darunter nicht unterstützt wird.
4 Stimmen
@Wynand Das ist überhaupt kein gutes Argument. Es gibt eine Menge Polyfills für
Object.create
die zum Beispiel gefunden werden können: refheap.com/900061 Stimmen
@froginvasion In Ordnung, obwohl ich argumentieren könnte, dass der Auftraggeber eine "elegante" [ sic und nicht jeder würde notwendigerweise zustimmen, dass die Verwendung eines Polyfills dieser Beschreibung entspricht. Ich habe nur versucht, Ihnen Folgendes mitzuteilen a möglicher Grund dafür
Object.create
wurde nicht vorgeschlagen (falls dies der Fall ist), weshalb ich "wahrscheinlich" schrieb. Unabhängig davon bin ich für Polyfills und habe mir vor kurzem Folgendes angesehen diese eine, die übrigens ähnlich wie Ihr Schnipsel ist. Wenn Sie ein besseres Feedback wünschen, könnten Sie Ihren Vorschlag auch als Antwort hinzufügen.2 Stimmen
Object.create eignet sich hervorragend, wenn Sie den Prototyp Ihres Objekts kopieren möchten.
59 Stimmen
var x = { deep: { key: 1 } }; var y = Object.create(x); x.deep.key = 2;
Nachdem Sie dies getan haben,y.deep.key
wird auch 2 sein, daher kann Object.create NICHT zum Klonen verwendet werden...1 Stimmen
@froginvasion - weil es nicht einmal für flache Objekte funktioniert? (Chrome 45). Du bekommst einfach
__proto__
nicht ein Klon...2 Stimmen
Object.create
bekommt man nicht__proto__
wird ein neues Objekt erzeugt, dessen Prototyp auf das Argument verweist, wodurch eine Kette entsteht. Ich stimme zu, dass es sich vielleicht nicht um einen echten "Klon" im traditionellen Sinne handelt, aber je nach SituationObject.create
ist viel konsistenter als die verschiedenen Klontechniken, die im Folgenden verwendet werden. developer.mozilla.org/de-US/docs/Web/JavaScript/Reference/1 Stimmen
Wie wäre es mit
var newObj = (function(){ return oldObj; }());
23 Stimmen
@r3wt das wird nicht funktionieren... Bitte posten Sie erst, nachdem Sie einen grundlegenden Test der Lösung durchgeführt haben...
2 Stimmen
Hier ein Benchmark von verschiedenen Lösungen: jsben.ch/#/bWfk9
0 Stimmen
@RubenStolk warum kann OP das Objekt nicht in eine neue Variable speichern?
var copyobject=object
??4 Stimmen
@Mahi Dadurch wird das Objekt nicht kopiert. Es wird eine neue Variable erstellt, die auf das gleiche Objekt verweist.
0 Stimmen
@LordLoh. Was ist, wenn Sie in einer Javascript-Umgebung sind, in der Sie keine Bibliotheken wie JSON importieren können. Apples Quartz Composer Editor zum Beispiel, nicht sicher über Adobe CC Scripting.
1 Stimmen
developer.mozilla.org/de-US/docs/Web/JavaScript/Reference/ - Ich habe das gerade mit dem Chrome-Entwickler-Terminal ausprobiert -
oj1={}; oj1.p1=222; oj2={}; Object.assign(oj2,oj1); oj2.p1=555; oj1.p1;
- wird dies zeigen222
Auch hier wird geantwortet: stackoverflow.com/a/36177142/4821760 Stimmen
@LordLoh. Anscheinend kann ich JSON.parse und JSON.stringify doch innerhalb von QC aufrufen. Core Funktionen aufrufen. Auch habe ich dieses Polyfill auf der Referenzseite und Links zu erweiterten Polyfills JSON2 und JSON3 gefunden: developer.mozilla.org/de-US/docs/Web/JavaScript/Reference/
3 Stimmen
{...original}
6 Stimmen
Wenn Sie Object.create() vorschlagen, dann wissen Sie sehr wenig über JS. Mit Object.create wird das Objekt X nicht geklont. Y = Object.create(X) tut dies und nichts weiter: Es wird ein neues Objekt Y mit X als Prototyp erstellt. Das Objekt X wird zum Prototyp von Objekt Y. Das ist nicht das, was Sie wollen. Ganz und gar nicht. Da die Methoden und Daten von X nicht nach Y kopiert werden, sondern referenziert werden, enthält Y eine Referenz auf die Daten und Methoden von X. Wie falsch kann man liegen!?
0 Stimmen
Kürzlich beantwortete es über aquí
0 Stimmen
Ver developer.mozilla.org's JavaScript/Referenz von assign#Deep_Clone .
0 Stimmen
Dadurch sollte eine Kopie erstellt werden:
let y = {...x};
0 Stimmen
Sie können die Clone-Methode von Lodash oder den Spread-Operator verwenden let x = {} let y = {irgendein Wert} x = {...x, ...y}
0 Stimmen
stackoverflow.com/questions/38416020/