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/ assignfunciona: 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 mergefunciona: 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
_.extendes un alias para_.assign, lo que son idénticosnulllo mismoLas diferencias
_.defaultsy_.defaultsDeepprocesa los argumentos en orden inverso en comparación con los demás (aunque el primer argumento sigue siendo el objeto de destino)_.mergey_.defaultsDeepfusionará objetos secundarios y los demás se sobrescribirán en el nivel raíz_.assigny_.extendsobrescribirá un valor conundefinedPruebas
Todos manejan miembros en la raíz de manera similar.
_.assignmanejaundefinedpero los demás lo omitiránTodos manejan
nulllo mismoPero solo
_.mergey_.defaultsDeepfusionará 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 identicalconflictos conOnly _.assign will overwrite a value with undefinedOtra diferencia a la que prestar atención es el manejo de
undefinedvalores:Por
mergelo tanto , no fusionaráundefinedvalores en valores definidos.fuente
mergeIntotuviera propiedades quetoMergeno 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
objreferenciaobj = _.assign(obj, _.merge(obj, [source]))fuente