Vamos dar uma olhada em um exemplo.
var arr1 = new Array({name: "lang", value: "English"}, {name: "age", value: "18"});
var arr2 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
Preciso mesclar essas 2 matrizes de objetos e criar a seguinte matriz:
arr3 = new Array({name: "lang", value: "German"}, {name: "age", value: "18"}, {name : "childs", value: '5'});
Existe alguma função JavaScript ou jQuery para fazer isso?
$.extend
não combina comigo. Retorna
arr4 = new Array({name : "childs", value: '5'}, {name: "lang", value: "German"});
javascript
jquery
arrays
Alexandre
fonte
fonte
{name: "lang", value: "English"}
?Respostas:
Se você deseja mesclar 2 arrays de objetos em JavaScript. Você pode usar este truque de uma linha
Array.prototype.push.apply(arr1,arr2);
Por exemplo
Resultado:
fonte
arr1 = arr1.concat(arr2)
concat
retornará uma nova matriz e quebrará todas as referências que você tinha.Com ES6, você pode fazer isso muito facilmente, conforme abaixo:
Resultado:
fonte
{ name: 'lang', value: 'German'}
Para aqueles que estão experimentando coisas modernas:
fonte
Atualização 12 de outubro de 2019
Nova versão baseada apenas em Javascript mais recente e sem a necessidade de qualquer biblioteca de terceiros.
Essa resposta estava ficando velha, libs como lodash e underscore são muito menos necessárias hoje em dia. Nesta nova versão, o array target (arr1) é aquele com o qual estamos trabalhando e queremos manter atualizado. A matriz de origem (arr2) é de onde os novos dados estão vindo, e queremos que sejam mesclados em nossa matriz de destino .
Fazemos um loop sobre o array de origem procurando novos dados e, para cada objeto que ainda não foi encontrado em nosso array de destino , simplesmente adicionamos esse objeto usando target.push (sourceElement) If, com base em nossa propriedade de chave ('nome') , um object já está em nosso array de destino - atualizamos suas propriedades e valores usando Object.assign (targetElement, sourceElement) . Nosso “target” será sempre o mesmo array e com conteúdo atualizado.
Resposta antiga usando sublinhado ou lodash
Sempre chego aqui do google e nem sempre fico satisfeito com as respostas. SUA resposta é boa, mas será mais fácil e mais organizada usando o underscore.js
DEMO: http://jsfiddle.net/guya/eAWKR/
Aqui está uma função mais geral que mesclará 2 arrays usando uma propriedade de seus objetos. Neste caso, a propriedade é 'nome'
fonte
fonte
Muito simples usando o operador de propagação ES6:
Merged Array: [ {a: 'HI!'}, {b: 'HOW'} {c: 'ARE'}, {d: 'YOU?'} ]
Nota: A solução acima é apenas mesclar duas matrizes usando o operador de propagação ES6.
Editar em 07 de janeiro de 2020 por @ bh4r4th: Como o contexto mudou devido a edições após minha solução inicial. Eu gostaria de atualizar minha solução para corresponder aos critérios atuais. ou seja,
Mesclar objetos de matriz sem criar objetos duplicados e,
atualize
value
se aname
propriedade já existir na matriz anteriorfonte
set
na mesclagem para remover duplicatas. Isso criaria um novo argumento de variável, mas código mínimo. No entanto, não sou um grande fã de carga útil, que tem nomes definidos como propriedades e valores como tipos diferentes. Em vez disso, prefiro[ { lang: 'German', age: 25}]
. Desta forma, o peso da carga útil será minimizado durante a comunicação entre os serviços.Mesclando duas matrizes:
Mesclando duas matrizes sem valores duplicados para 'nome':
fonte
A maneira mais fácil é com alguma magia ES6:
Mesclar dois com duplicatas:
Sem duplicatas, é igual ao anterior, mais:
const distinct = [...new Set(result.map(item => item.YOUR_PROP_HERE))]
fonte
Com lodash:
fonte
É assim que lidei com um problema semelhante em um contexto ES6:
Nota: Esta abordagem não retornará nenhum item da matriz1 que não apareça na matriz2.
EDIT: Eu tenho alguns cenários em que desejo preservar itens que não aparecem na segunda matriz, então eu vim com outro método.
fonte
Ainda outra versão usando
reduce() method
:fonte
fonte
Você pode usar um objeto para coletar suas propriedades enquanto substitui duplicatas e, em seguida, expandir / nivelar esse objeto de volta para uma matriz. Algo assim:
Não sei se esta é a maneira mais rápida, mas funciona para qualquer número de matrizes de entrada; por exemplo, este:
Dá a você a mesma coisa
a
que estava emarr3
com "Alemão" substituído por "Panquecas".Essa abordagem pressupõe que todos os seus objetos tenham a mesma
{name: ..., value: ...}
forma, é claro.Você pode vê-lo funcionando aqui (abra seu console, por favor): http://jsfiddle.net/ambiguous/UtBbB/
fonte
E sobre o jQuery Merge?
http://api.jquery.com/jQuery.merge/
Exemplo de jsFiddle aqui: http://jsfiddle.net/ygByD/
fonte
name
propriedades.Eu estava enfrentando o mesmo problema e com base na resposta de guya , estendi a biblioteca de sublinhados e também adicionei um pouco mais de funcionalidade que estava exigindo. Aqui está a essência .
Espero que seja útil! Saudações!
fonte
Recentemente, fiquei perplexo com esse problema e vim aqui com a esperança de ter uma resposta, mas a resposta aceita usa 2 for em loops, o que eu não preferiria. Finalmente consegui fazer o meu. Não depende de nenhuma biblioteca:
Isso também mantém a ordem de arr1.
fonte
você poderia usar a seguinte função
e tentar
fonte
Aqui, primeiro filtro com
arr1
base no elemento presentearr2
ou não. Se estiver presente, não o adicione ao array resultante, caso contrário, adicione. E então acrescentoarr2
ao resultado.fonte
Em cima da minha cabeça - tente jquery extend
fonte
var newArray = yourArray.concat(otherArray); console.log('Concatenated newArray: ', newArray);
fonte
Array.protype.push.apply()
resposta, mas não faz a mesclagem como o OP queria.Com base na resposta de @ YOU, mas mantendo a ordem:
Sei que essa solução é menos eficiente, mas é necessária se você quiser manter a ordem e ainda atualizar os objetos.
fonte
Aqui está um plugin jQuery que escrevi para mesclar duas matrizes de objetos por uma chave. Lembre-se de que isso modifica a matriz de destino no local.
Versão ES6
fonte
Usando lodash, você deseja _.uniqBy
Ordem de arr1, arr2 importa!
Veja os documentos https://lodash.com/docs/4.17.4#uniqBy
fonte
fonte
fonte
Se você quiser mesclar os 2 arrays, mas remover objetos duplicados, use isso. Duplicados são identificados em
.uniqueId
cada objetofonte
Experimente isto:
OutPut será:
fonte
fonte
Solução utilizando JS Map:
Que produz:
fonte
fonte