Na biblioteca Lodash , alguém pode fornecer uma explicação melhor da mesclagem e extensão / atribuição .
É uma pergunta simples, mas a resposta me escapa.
fonte
Na biblioteca Lodash , alguém pode fornecer uma explicação melhor da mesclagem e extensão / atribuição .
É uma pergunta simples, mas a resposta me escapa.
Veja como extend
/assign
obras: Para cada propriedade na origem, copie seu valor como está até o destino. se os próprios valores da propriedade são objetos, não há um percurso recursivo de suas propriedades. O objeto inteiro seria retirado da origem e definido no destino.
Eis como merge
funciona: Para cada propriedade na fonte, verifique se essa propriedade é o próprio objeto. Se estiver, desça recursivamente e tente mapear as propriedades do objeto filho da origem ao destino. Então, basicamente, mesclamos a hierarquia de objetos da origem ao destino. Enquanto para extend
/ assign
, é uma cópia simples de um nível das propriedades da origem ao destino.
Aqui está o JSBin simples que deixaria isso bem claro: http://jsbin.com/uXaqIMa/2/edit?js,console
Aqui está uma versão mais elaborada que inclui matriz no exemplo também: http://jsbin.com/uXaqIMa/1/edit?js,console
var combined = merge({}, src, dest)
Versão Lodash 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])
Semelhanças
_.extend
é um apelido para_.assign
, então eles são idênticosnull
o mesmoDiferenças
_.defaults
e_.defaultsDeep
processa os argumentos em ordem inversa em comparação com os outros (embora o primeiro argumento ainda seja o objeto de destino)_.merge
e_.defaultsDeep
mesclará objetos filho e os outros substituirão no nível raiz_.assign
e_.extend
substituirá um valor comundefined
Testes
Todos eles lidam com membros na raiz de maneiras semelhantes.
_.assign
alças,undefined
mas os outros vão pularTodos eles lidam com
null
o mesmoMas apenas
_.merge
e_.defaultsDeep
mesclará objetos filhoE nenhum deles irá mesclar matrizes parece
Todos modificam o objeto de destino
Nenhum realmente funciona como esperado em matrizes
Nota: Como o @Mistic apontou, o Lodash trata matrizes como objetos em que as chaves são o índice da matriz.
fonte
_.extend is an alias for _.assign, so they are identical
conflitos comOnly _.assign will overwrite a value with undefined
Outra diferença a ser observada é a manipulação de
undefined
valores:Portanto
merge
, não mesclaráundefined
valores em valores definidos.fonte
mergeInto
tivesse propriedades quetoMerge
não possuíam, ele as manteria. Nesse caso, não seria um clone.Também pode ser útil considerar o que eles fazem do ponto de vista semântico:
_.atribuir
_.merge
_.defaults
_.defaultsDeep
Acredito que aprender a pensar nesses métodos do ponto de vista semântico permitiria "adivinhar" qual seria o comportamento de todos os diferentes cenários de valores existentes e não existentes.
fonte
Se você deseja uma cópia profunda sem substituir, mantendo a mesma
obj
referênciaobj = _.assign(obj, _.merge(obj, [source]))
fonte