Angesichts des Objekts:
var firstObject = {
key1 : 'value1',
key2 : 'value2'
};
Wie kann ich die Eigenschaften in ein anderes Objekt ( secondObject
) wie folgt kopieren :
var secondObject = {
key1 : 'value1',
key2 : 'value2',
key3 : 'value3',
key4 : 'value4'
};
mit einem Verweis auf die firstObject
? Etwas wie das:
var secondObject = {
firstObject,
key3 : 'value3',
key4 : 'value4'
};
(Das funktioniert nicht ... Ich habe es nur in großen Zeilen dargestellt, um zu zeigen, wie ich den Code strukturieren möchte.)
Ist eine Lösung ohne Verwendung von JavaScript-Frameworks möglich?
javascript
Igor Popov
quelle
quelle
secondObject = JSON.parse('{' + JSON.stringify(firstObject).match(/^.(.*).$/)[1] + ',' + JSON.stringify(secondObject).match(/^.(.*).$/)[1] + '}');
Antworten:
quelle
hasOwnProperty
es nutzlos ist. Während ich Ihren Zeiger nützlich finden, halte ich die Idee der Anwendung irgendwelche Regeln zu jeder Situation schädlich und unklug. Wie all diese mustergetriebenen Entwicklungspraktiken, die derzeit stattfinden, nehmen Sie es nicht persönlich ...hasOwnProperty()
Test aus und die Dinge funktionieren irgendwie weiter. Bis sie aufhören, weil Ihre Objekte im Laufe der Zeit komplexer wurden. Außer dann bricht es auf mysteriöse Weise in einem nicht verwandten Teil des Codes, weil zu viel kopiert wurde. Und Sie haben keinen Kontext zum Debuggen. JS ist so beschissen, daher ist eine sorgfältige Codierung, um das Auftreten solcher Probleme zu verhindern, umsichtig.Ausgehend von der Antwort von @ Bardzuśny hat ES6 eine native Lösung geliefert: die
Object.assign()
Funktion!Die Verwendung ist einfach:
Das ist es!
Die Unterstützung ist derzeit offensichtlich schlecht. Nur Firefox (34+) unterstützt es sofort, während Chrome (45+) und Opera (32+) das Setzen des 'experimentellen Flags' erfordern.Die Unterstützung wird verbessert, wobei die neuesten Versionen von Chrome, Firefox, Opera, Safari und Edge dies unterstützen (IE hat insbesondere keine Unterstützung). Transpiler wie Babel und Traceur sind ebenfalls verfügbar. Sehen Sie hier für weitere Details.
quelle
Object.assign()
-nur Shim: github.com/ljharb/object.assign ).Per ES6 - Spread-Syntax :
Sie können einfach verwenden:
Dies vermeidet Probleme beim Übergeben dieser Objekte als Referenz.
Zusätzlich werden Objekte mit tiefer Verschachtelung behandelt.
quelle
Durchlaufen Sie die Eigenschaften des ersten Objekts und weisen Sie sie dem zweiten Objekt wie folgt zu:
Die
for
-in
Schleife ist nicht genug; du brauchsthasOwnProperty
. Unter http://bonsaiden.github.com/JavaScript-Garden/#object.forinloop finden Sie eine ausführliche Erklärung, warum.quelle
reference
im technischen Sinne verwendet. Ich denke, er meint nur natürliche Sprache "beziehen auf".Hier den Nekromanten spielen, weil ES5 uns gebracht hat
Object.keys()
, mit dem Potenzial, uns vor all diesen.hasOwnProperty()
Prüfungen zu retten .Oder wickeln Sie es in eine Funktion ein (begrenzte "Kopie" von lodash
_.assign()
):Object.keys()
ist eine relativ neue Methode, vor allem: nicht verfügbar in IE <9. Das gleiche gilt für die.forEach()
Array-Methode, die ich anstelle der regulärenfor
Schleife verwendet habe.Glücklicherweise gibt es für diese alten Browser es5-shim , das viele ES5-Funktionen (einschließlich dieser beiden) mehrfach ausfüllt.
(Ich bin alles für Polyfills, anstatt mich von der Verwendung cooler, neuer Sprachfunktionen zurückzuhalten.)
quelle
Necro'ing, damit Benutzer mit hasOwnProperty und der tatsächlichen Objektprüfung eine Deep-Copy-Methode finden können:
quelle
'[object Array]'
Man kann Object.assign verwenden , um Objekte zu kombinieren. Die gemeinsame Eigenschaft wird von rechts nach links kombiniert und überschrieben, dh dieselbe Eigenschaft links wird von rechts überschrieben.
Und es ist wichtig , im ersten ein leeres Objekt anzugeben, um eine Mutation der Quellobjekte zu vermeiden. Die Quellobjekte sollten sauber bleiben, da sie
Object.assign()
selbst ein neues Objekt zurückgeben.Hoffe das hilft!
quelle
Verbesserung der kingPuppy- Idee und der OP-Idee (flache Kopie) - Ich füge nur 3 Punkte zum OP "Beispiel" hinzu :)
Code-Snippet anzeigen
quelle
Dies sollte funktionieren, hier getestet .
Hinweis : Dadurch werden die Methoden von
firstObject
Hinweis 2 nicht kopiert. Für die Verwendung in älteren Browsern benötigen Sie einen JSON-Parser.
Hinweis 3 : Die Zuweisung per Referenz ist eine praktikable Option, insbesondere wenn sie
firstObject
Methoden enthält. Das angegebene jsfiddle-Beispiel wurde entsprechend angepasstquelle
Leider können Sie in einem solchen Objekt keinen Verweis auf eine Variable einfügen. Sie können jedoch eine Funktion erstellen, die die Werte des Objekts in ein anderes Objekt kopiert.
quelle
Wenn Sie nur die Eigenschaften abrufen möchten, die im zweiten Objekt vorhanden sind, können Sie
Object.keys
die Eigenschaften des ersten Objekts abrufen. Sie haben zwei Methoden:A.)
map
um die Eigenschaften des ersten Objekts dem zweiten Objekt unter Verwendung von Nebenwirkungen zuzuweisen:B.) oder
reduce
um ein neues Objekt zu erstellen und es dem zweiten Objekt zuzuweisen. Bitte beachten Sie, dass diese Methode ersetzt andere Eigenschaften das zweite Objekt davor haben könnte , die nicht das erste Objekt brachte:quelle
Verwenden Sie die Eigenschaftsverbreitungsnotation. Es wurde in ES2018 hinzugefügt (Spread für Arrays / Iterables war früher, ES2015). {... firstObject} verteilt alle aufzählbaren Eigenschaften als diskrete Eigenschaften.
quelle
Ich würde lieber firstObject als Prototyp von secondObject verwenden und einen Eigenschaftsdeskriptor hinzufügen:
Es ist sicherlich kein Einzeiler, aber es gibt Ihnen mehr Kontrolle. Wenn Sie an Eigenschaftsbeschreibungen interessiert sind, empfehle ich, diesen Artikel zu lesen: http://patrickdelancy.com/2012/09/property-descriptors-in-javascript/#comment-2062 und MDN-Seite https: //developer.mozilla. org / de-US / docs / Web / JavaScript / Reference / Global_Objects / Object / create
Sie können auch einfach Werte zuweisen und die Deskriptoren weglassen und etwas kürzer machen:
Kompatibilität: ECMAScript 5, also IE9 +
quelle
Mit der folgenden Methode werden die Eigenschaften kopiert
Ich bin sehr neu in Javascript, fand aber, dass dies funktioniert. Ein bisschen zu lang, denke ich, aber es funktioniert.
quelle