En la biblioteca de Lodash , ¿alguien puede proporcionar una mejor explicación de fusión y extensión / asignación .
Es una pregunta simple pero la respuesta me evade.
fuente
En la biblioteca de Lodash , ¿alguien puede proporcionar una mejor explicación de fusión y extensión / asignación .
Es una pregunta simple pero la respuesta me evade.
Aquí se explica cómo extend
/ assign
funciona: para cada propiedad en el origen, copie su valor tal cual al destino. Si los valores de propiedad en sí mismos son objetos, no existe un recorrido recursivo de sus propiedades. Todo el objeto se tomaría del origen y se establecería en el destino.
Así es como merge
funciona: para cada propiedad en la fuente, verifique si esa propiedad es el objeto mismo. Si es así, baje de forma recursiva e intente asignar propiedades de objetos secundarios desde el origen al destino. Entonces, esencialmente fusionamos la jerarquía de objetos de origen a destino. Mientras que para extend
/ assign
, es una copia simple de un nivel de propiedades desde el origen hasta el destino.
Aquí hay un JSBin simple que aclararía esto: http://jsbin.com/uXaqIMa/2/edit?js,console
Aquí hay una versión más elaborada que incluye una matriz en el ejemplo también: http://jsbin.com/uXaqIMa/1/edit?js,console
var combined = merge({}, src, dest)
Lodash versión 3.10.1
Métodos comparados
_.merge(object, [sources], [customizer], [thisArg])
_.assign(object, [sources], [customizer], [thisArg])
_.extend(object, [sources], [customizer], [thisArg])
_.defaults(object, [sources])
_.defaultsDeep(object, [sources])
Similitudes
_.extend
es un alias para_.assign
, lo que son idénticosnull
lo mismoLas diferencias
_.defaults
y_.defaultsDeep
procesa los argumentos en orden inverso en comparación con los demás (aunque el primer argumento sigue siendo el objeto de destino)_.merge
y_.defaultsDeep
fusionará objetos secundarios y los demás se sobrescribirán en el nivel raíz_.assign
y_.extend
sobrescribirá un valor conundefined
Pruebas
Todos manejan miembros en la raíz de manera similar.
_.assign
manejaundefined
pero los demás lo omitiránTodos manejan
null
lo mismoPero solo
_.merge
y_.defaultsDeep
fusionará objetos secundariosY ninguno de ellos fusionará matrices, parece
Todos modifican el objeto de destino
Ninguno realmente funciona como se esperaba en las matrices
Nota: Como señaló @Mistic, Lodash trata las matrices como objetos donde las claves son el índice de la matriz.
fuente
_.extend is an alias for _.assign, so they are identical
conflictos conOnly _.assign will overwrite a value with undefined
Otra diferencia a la que prestar atención es el manejo de
undefined
valores:Por
merge
lo tanto , no fusionaráundefined
valores en valores definidos.fuente
mergeInto
tuviera propiedades quetoMerge
no tuvieran, entonces retendría esas propiedades. En ese caso no sería un clon.También podría ser útil considerar lo que hacen desde un punto de vista semántico:
_.asignar
_.unir
_defectos
_.defaultsDeep
Creo que aprender a pensar en esos métodos desde el punto de vista semántico le permitiría "adivinar" mejor cuál sería el comportamiento para todos los diferentes escenarios de valores existentes y no existentes.
fuente
Si desea una copia profunda sin anulación mientras conserva la misma
obj
referenciaobj = _.assign(obj, _.merge(obj, [source]))
fuente