Qual é a maneira mais eficiente de concatenar N matrizes de objetos em JavaScript?
As matrizes são mutáveis e o resultado pode ser armazenado em uma das matrizes de entrada.
javascript
arrays
Leonid
fonte
fonte
Respostas:
Se você concatenar mais de duas matrizes,
concat()
é o caminho a seguir para conveniência e desempenho provável.Para concatenar apenas duas matrizes, o fato de
push
aceitar vários argumentos que consistem em elementos a serem adicionados à matriz pode ser usado para adicionar elementos de uma matriz ao final de outra sem produzir uma nova matriz. Comslice()
ele também pode ser usado em vez de,concat()
mas parece não haver vantagem de desempenho ao fazer isso .No ECMAScript 2015 e posterior, isso pode ser reduzido ainda mais para
No entanto, parece que, para matrizes grandes (da ordem de 100.000 membros ou mais), a técnica que envia uma matriz de elementos para
push
(usandoapply()
ou o operador de propagação ECMAScript 2015) pode falhar. Para essas matrizes, usar um loop é uma abordagem melhor. Consulte https://stackoverflow.com/a/17368101/96100 para obter detalhes.fonte
a.concat(b)
caso de teste parece desnecessariamente fazer uma cópia da matriz ea
depois jogá-la fora.concat()
geralmente é mais rápida. No caso de concatenar uma matriz em uma matriz existente,push()
é o caminho a percorrer. Eu atualizei minha resposta.edit : prova de eficiência: http://jsperf.com/multi-array-concat/7
edit2 : Tim Supinie menciona nos comentários que isso pode fazer com que o intérprete exceda o tamanho da pilha de chamadas. Talvez isso dependa do mecanismo js, mas também recebi "Tamanho máximo da pilha de chamadas excedido" no Chrome. Caso de teste:
[].concat.apply([], Array(300000).fill().map(_=>[1,2,3]))
. (Também obtive o mesmo erro ao usar a resposta atualmente aceita; portanto, se você está antecipando esses casos de uso ou construindo uma biblioteca para outros, testes especiais podem ser necessários, independentemente da solução escolhida.)fonte
Para pessoas que usam o ES2015 (ES6)
Agora você pode usar a sintaxe de propagação para concatenar matrizes:
fonte
O
concat()
método é usado para unir duas ou mais matrizes. Ele não altera as matrizes existentes, retorna apenas uma cópia das matrizes unidas.fonte
concat
é usado especificamente para criar novas matrizes sem alterar a matriz original. Se você deseja atualizararray1
, você teria que usararray1.push(...array2, ...array3, ...array4)
Use Array.prototype.concat.apply para manipular a concatenação de várias matrizes:
Exemplo:
fonte
Se você estiver no meio da canalização do resultado através de map / filter / sort, etc, e quiser concaturar a matriz de matrizes, poderá usar
reduce
fonte
Para matriz de várias matrizes e ES6, use
Por exemplo:
fonte
newArr = Array.from(new Set(newArr));
.any[]
? A digitação está lá - estranha.[].concat.apply([], ...arr)
desempenho muito melhor em grandes volumes.Agora podemos combinar várias matrizes usando
ES6
Spread
. Em vez de usarconcat()
para concatenar matrizes, tente usar a sintaxe de dispersão para combinar várias matrizes em uma matriz nivelada. por exemplo:fonte
resolvido assim.
fonte
Você pode usar o site jsperf.com para comparar o desempenho. Aqui está o link para concat .
Adicionado comparação entre:
e:
O segundo é quase 10 vezes mais lento no cromo.
fonte
push.apply()
, o que parece ser mais rápido do queconcat()
em todos os navegadores, exceto o Chrome. Veja minha resposta.Facilmente com a função concat:
fonte
Aqui está uma função pela qual você pode concatenar vários números de matrizes
Exemplo -
irá produzir
fonte
Se você possui uma matriz de matrizes e deseja concaturar os elementos em uma única matriz, tente o seguinte código (Requer ES2015):
Ou se você gosta de programação funcional
Ou ainda melhor com a sintaxe ES5, sem o operador spread
Dessa forma, é útil se você não souber o não. de matrizes no horário do código.
fonte
Encurte com ES6.
Isso concat e único os vários arrays;
Demonstração no codepen
fonte
new Set()
remove itens duplicados. Apenas remova-o.[].concat(...Array)
Mesclar matriz com push:
Usando o operador Concat e Spread:
fonte
onde 'n' é um número de matrizes, talvez uma matriz de matrizes. . .
var resposta = _.reduce (n, função (a, b) {retorna a.concat (b)})
fonte
Se houver apenas duas matrizes para concat, e você realmente precisar anexar uma das matrizes em vez de criar uma nova, o push ou loop será o caminho a percorrer.
Referência: https://jsperf.com/concat-small-arrays-vs-push-vs-loop/
fonte
tente isto:
fonte
se as matrizes N são obtidas do banco de dados e não codificadas, o farei assim usando o ES6
fonte