Dans la bibliothèque Lodash , quelqu'un peut-il fournir une meilleure explication de la fusion et de l' extension / attribution .
C'est une question simple mais la réponse m'échappe néanmoins.
la source
Dans la bibliothèque Lodash , quelqu'un peut-il fournir une meilleure explication de la fusion et de l' extension / attribution .
C'est une question simple mais la réponse m'échappe néanmoins.
Voici comment extend
/ assign
fonctionne: Pour chaque propriété dans la source, copiez sa valeur telle quelle dans la destination. si les valeurs de propriété elles-mêmes sont des objets, il n'y a pas de traversée récursive de leurs propriétés. L'objet entier serait pris de la source et placé dans la destination.
Voici comment cela merge
fonctionne: Pour chaque propriété dans la source, vérifiez si cette propriété est un objet lui-même. Si c'est le cas, descendez récursivement et essayez de mapper les propriétés des objets enfants de la source à la destination. Donc, nous fusionnons essentiellement la hiérarchie des objets de la source à la destination. Tandis que pour extend
/ assign
, c'est une simple copie à un niveau des propriétés de la source à la destination.
Voici un JSBin simple qui rendrait ce cristal clair: http://jsbin.com/uXaqIMa/2/edit?js,console
Voici une version plus élaborée qui inclut également un tableau dans l'exemple: http://jsbin.com/uXaqIMa/1/edit?js,console
var combined = merge({}, src, dest)
Lodash version 3.10.1
Méthodes comparées
_.merge(object, [sources], [customizer], [thisArg])
_.assign(object, [sources], [customizer], [thisArg])
_.extend(object, [sources], [customizer], [thisArg])
_.defaults(object, [sources])
_.defaultsDeep(object, [sources])
Similitudes
_.extend
est un alias pour_.assign
, ils sont donc identiquesnull
la même choseDifférences
_.defaults
et_.defaultsDeep
traite les arguments dans l'ordre inverse par rapport aux autres (bien que le premier argument soit toujours l'objet cible)_.merge
et_.defaultsDeep
fusionnera les objets enfants et les autres écraseront au niveau racine_.assign
et_.extend
écrasera une valeur avecundefined
Les tests
Ils gèrent tous les membres à la racine de manière similaire.
_.assign
poignéesundefined
mais les autres l'ignorerontIls gèrent tous
null
la même choseMais seulement
_.merge
et_.defaultsDeep
fusionnera les objets enfantsEt aucun d'eux ne fusionnera les tableaux, il semble
Tous modifient l'objet cible
Aucun ne fonctionne vraiment comme prévu sur les tableaux
Remarque: Comme l'a souligné @Mistic, Lodash traite les tableaux comme des objets dont les clés sont l'index dans le tableau.
la source
_.extend is an alias for _.assign, so they are identical
conflits avecOnly _.assign will overwrite a value with undefined
Une autre différence à prendre en compte est la gestion des
undefined
valeurs:merge
Ne fusionnera donc pas lesundefined
valeurs en valeurs définies.la source
mergeInto
avait des propriétés quitoMerge
n'en avaient pas, il conserverait ces propriétés. Dans ce cas, ce ne serait pas un clone.Il pourrait également être utile de considérer ce qu'ils font d'un point de vue sémantique:
_.attribuer
_.fusionner
_.defaults
_.defaultsDeep
Je crois qu'apprendre à penser à ces méthodes du point de vue sémantique vous permettrait de mieux "deviner" quel serait le comportement pour tous les différents scénarios de valeurs existantes et non existantes.
la source
Si vous souhaitez une copie complète sans remplacement tout en conservant la même
obj
référenceobj = _.assign(obj, _.merge(obj, [source]))
la source