JS
CV

Merge de Arrays no Javascript

ago 23, 2024 3 min - tempo de leitura

two roads

Alguns dias atrás, precisei desenvolver uma feature que exigia o merge de dois arrays. Inicialmente, utilizei o spread operator (...), resultando no seguinte código:

const array1 = Array.from({length: 10000}, (_, index) => index)
const array2 = Array.from({length: 10000}, (_, index) => index)
 
const all = [...array1, ...array2 ]

Duração do script em milissegundos 7.838104993104935

A princípio, isso resolveu meu problema, e consegui realizar o merge dos arrays. No entanto, fiquei me perguntando se haveria uma maneira de melhorar a performance. Ao consultar a documentação, encontrei o método concat.

Merge com o Concat

O método concat é utilizado justamente para mesclar dois ou mais arrays, sem alterar os arrays existentes, mas retornando um novo array mesclado. Com o uso do concat, o merge ficaria da seguinte forma:

const array1 = Array.from({length: 10000}, (_, index) => index)
const array2 = Array.from({length: 10000}, (_, index) => index)
 
const all = [].concat(array1, array2)

Duração do script em milissegundos: 2.6480610072612762

Como podemos ver, com o uso do concat, conseguimos uma redução de mais de 50% no tempo de execução do merge, tornando-o, em muitos casos, uma alternativa muito mais eficiente que o spread operator.

Bônus: remover itens duplicados

Nessa mesma feature em que estive trabalhando, precisei remover os itens duplicados do array retornado do merge. Podemos fazer isso utilizando o método indexOf, ficando da seguinte maneira:

const array1 = Array.from({ length: 10000 }, (_, index) => index);
const array2 = Array.from({ length: 10000 }, (_, index) => index);
 
const all = [].concat(array1, array2);
 
const arrayWithoutDuplicates = all.filter(
    (item, index) => all.indexOf(item) === index
);

Duração do script em milissegundos: 36.275166511535645

Como podemos ver acima, fazemos um filtro no nosso array mergead o, passando um callback que verifica se o índice do primeiro aparecimento do item no array all é igual ao índice atual (index) do loop. Dessa forma, o callback retorna true apenas para a primeira ocorrência do item.

Porém, podemos remover os itens duplicados de uma maneira muito mais performática utilizando o Set. O objeto Set permite armazenar valores únicos — cada valor pode ocorrer apenas uma vez. Essa nova abordagem ficaria da seguinte forma:

const array1 = Array.from({ length: 10000 }, (_, index) => index);
const array2 = Array.from({ length: 10000 }, (_, index) => index);
 
const all = [].concat(array1, array2);
 
const arrayWithoutDuplicates = new Set(all);

Duração do script em milissegundos: 2.5936660766601562

Conclusão

Como podemos ver nos exemplos acima, o uso adequado de técnicas em JavaScript pode melhorar substancialmente a performance do seu código. Para mesclar arrays, podemos usar o método concat, e para remover duplicados, podemos utilizar o objeto Set.

Referências