Qual é a melhor maneira / padrão de mesclar duas matrizes associativas em JavaScript? Todo mundo faz isso rolando seu próprio for
loop?
javascript
object
Wilhelm
fonte
fonte
Respostas:
com jquery você pode chamar
$.extend
(matrizes associadas são objetos em js)
veja aqui: http://api.jquery.com/jQuery.extend/
edit: Como rymo sugeriu, é melhor fazê-lo desta maneira:
Como aqui obj1 (e obj2) permanecem inalterados.
edit2: Em 2018, a maneira de fazer isso é via
Object.assign
:Se estiver trabalhando com o ES6, isso pode ser alcançado com o Operador de propagação :
fonte
obj1
, use um objeto vazio como alvo:$.extend({}, obj1, obj2)
Object.assign()
, que não depende do JQuery se você ainda não estiver usando a biblioteca.Agora, em 2016, eu diria que a melhor maneira / padrão é o Object.assign ()
Pure Javascript. Não é necessário jQuery.
Mais informações, exemplos e polyfill aqui:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
fonte
É assim que o Prototype faz:
chamado como, por exemplo:
EDIT : adicionada verificação hasOwnProperty () conforme corretamente apontada por bucabay nos comentários
fonte
Mantenha simples...
fonte
arrau1.prototype
hasOwnProperty
cheque. Referir-se aos objetos como matrizes também é enganoso (eles são objetos), os nomes dos argumentos devem indicar que a matriz2 está mutada ou que um novo objeto deve ser retornado. Eu editaria a resposta, mas, na verdade, ela se tornaria quase exatamente a resposta editada de Jonathan Fingland, que já foi corrigida.O sublinhado também possui um método de extensão:
fonte
No dojo , a "mesclagem" de 2 objetos / matrizes seria
lang.mixin(destination, source)
- você também pode misturar várias fontes em um destino, etc. - consulte a referência da função mixin para obter detalhes.fonte
você deseja sobrescrever uma propriedade se os nomes forem iguais, mas os valores não forem?
E você deseja alterar permanentemente um dos objetos originais,
ou você deseja que um novo objeto mesclado seja retornado?
fonte
Rolando sua própria função de extensão / mixina
...
...
Isso simplesmente estende uma série de objetos, recursivamente. Além disso, observe que essa função recursiva é TCO ( Tail-Call Optimized ), pois seu retorno é a última chamada para si mesma.
Além disso, você pode querer propriedades direcionadas . Nesse caso, convém condensar objetos com base em
id
,quantity
ou outra propriedade. Essa abordagem pode ter um pequeno livro escrito sobre ela e requer justaposição de objetos e pode se tornar muito complexa. Eu escrevi uma pequena biblioteca para isso, que está disponível mediante solicitação.Espero que isto ajude!
fonte
fonte
Em 2019, você tem 2 boas opções:
Atribuição de objeto [ doc ]
Propagação de objeto [ doc ]
O primeiro tende a ser mais seguro, mais padrão e polivalente. Um bom prós e contras aqui
fonte
A interface do usuário do Yahoo (YUI) também possui uma função auxiliar para isso:
http://developer.yahoo.com/yui/examples/yahoo/yahoo_merge.html
fonte
jquery possui um booleano para cópia profunda. Você poderia fazer algo assim:
Além disso, você pode editar esta função para suportar n-matrizes para mesclar.
Então agora você pode fazer
fonte
Eu precisava de uma fusão profunda de objetos. Então, todas as outras respostas não me ajudaram muito. _.extend e jQuery.extend se saem bem, a menos que você tenha uma matriz recursiva como eu. Mas não é tão ruim, você pode programá-lo em cinco minutos:
fonte
Para mesclar matrizes no jQuery e quanto a $ .merge?
fonte
Solução recursiva (estende também matrizes de objetos) + nulo verificado
Testes
fonte
Object.getOwnPropertyNames is not a function
travará o aplicativo.Aqui está a melhor solução.
Além disso,
obj1
pode crescer dentro de um loop sem nenhum problema. (digamos queobj2
seja dinâmico)fonte