In der Lodash Bibliothek zur Verfügung stellen kann jemand eine bessere Erklärung der Zusammenführung und ausfahren / assign .
Es ist eine einfache Frage, aber die Antwort entgeht mir trotzdem.
quelle
In der Lodash Bibliothek zur Verfügung stellen kann jemand eine bessere Erklärung der Zusammenführung und ausfahren / assign .
Es ist eine einfache Frage, aber die Antwort entgeht mir trotzdem.
Hier ist , wie extend
/ assign
Werke: Für jede Eigenschaft in Quelle, kopieren Sie den Wert zum Ziel , wie sie ist. Wenn Eigenschaftswerte selbst Objekte sind, erfolgt keine rekursive Durchquerung ihrer Eigenschaften. Das gesamte Objekt wird aus der Quelle entnommen und auf das Ziel gesetzt.
So merge
funktioniert es: Überprüfen Sie für jede Eigenschaft in der Quelle, ob diese Eigenschaft selbst ein Objekt ist. Wenn dies der Fall ist, gehen Sie rekursiv nach unten und versuchen Sie, untergeordnete Objekteigenschaften von der Quelle zum Ziel zuzuordnen. Im Wesentlichen führen wir die Objekthierarchie von der Quelle zum Ziel zusammen. Während für extend
/ assign
ist es eine einfache einstufige Kopie der Eigenschaften von der Quelle zum Ziel.
Hier ist eine einfache JSBin, die dies kristallklar macht: http://jsbin.com/uXaqIMa/2/edit?js,console
Hier ist eine ausführlichere Version, die auch das Array im Beispiel enthält: http://jsbin.com/uXaqIMa/1/edit?js,console
var combined = merge({}, src, dest)
Lodash Version 3.10.1
Methoden verglichen
_.merge(object, [sources], [customizer], [thisArg])
_.assign(object, [sources], [customizer], [thisArg])
_.extend(object, [sources], [customizer], [thisArg])
_.defaults(object, [sources])
_.defaultsDeep(object, [sources])
Ähnlichkeiten
_.extend
ist ein Alias für_.assign
, also sind sie identischnull
das gleicheUnterschiede
_.defaults
und_.defaultsDeep
verarbeitet die Argumente in umgekehrter Reihenfolge im Vergleich zu den anderen (obwohl das erste Argument immer noch das Zielobjekt ist)_.merge
und_.defaultsDeep
werden untergeordnete Objekte zusammenführen und die anderen werden auf der Stammebene überschrieben_.assign
und_.extend
überschreibt einen Wert mitundefined
Tests
Sie alle behandeln Mitglieder an der Wurzel auf ähnliche Weise.
_.assign
Griffe,undefined
aber die anderen werden es überspringenSie alle behandeln
null
das gleicheAber nur
_.merge
und_.defaultsDeep
untergeordnete Objekte zusammenführenUnd keiner von ihnen wird Arrays zusammenführen, wie es scheint
Alle ändern das Zielobjekt
Keiner funktioniert wirklich wie erwartet auf Arrays
Hinweis: Wie @Mistic hervorhob, behandelt Lodash Arrays als Objekte, bei denen die Schlüssel der Index für das Array sind.
quelle
_.extend is an alias for _.assign, so they are identical
Konflikte mitOnly _.assign will overwrite a value with undefined
Ein weiterer zu beachtender Unterschied ist der Umgang mit
undefined
Werten:Es
merge
werden also keineundefined
Werte zu definierten Werten zusammengeführt.quelle
mergeInto
Eigenschaften vorhandentoMerge
wären, die diese nicht hätten, würden diese Eigenschaften beibehalten. In diesem Fall wäre es kein Klon.Es kann auch hilfreich sein, zu überlegen, was sie aus semantischer Sicht tun:
_.zuordnen
_.verschmelzen
_.defaults
_.defaultsDeep
Ich glaube, wenn Sie lernen, diese Methoden aus semantischer Sicht zu betrachten, können Sie besser erraten, wie sich die verschiedenen Szenarien bestehender und nicht existierender Werte verhalten.
quelle
Wenn Sie eine tiefe Kopie ohne Überschreiben wünschen, während Sie dieselbe
obj
Referenz beibehaltenobj = _.assign(obj, _.merge(obj, [source]))
quelle