Unir dois arrays em JavaScript: spread, concat ou push

Unir dois arrays em JavaScript: spread, concat ou push

Aqui ficam 2 maneiras de combinar os teus arrays e obter um NOVO array. Eu gosto de usar o operador spread. Mas se precisas de suportar browsers mais antigos, usa antes o concat.

javascript
// 2 formas de unir arrays

const fruits = ['pomme ', 'poire'];
const legumes = ['carotte ', 'salade'];

// Método 1: Concat
const combined1 = [].concat(fruits, legumes);

// Método 2: Spread
const combined2 = [...fruits, ...legumes];

// Resultado
// [ 'pomme', 'poire', 'carotte', 'salade' ]

Sintaxe alternativa do concat

Também podes escrever a sintaxe do concat desta forma:

javascript
const fruits = ['pomme ', 'poire'];
const legumes = ['carotte ', 'salade'];

const combined = fruits.concat(legumes);
// [ 'pomme', 'poire', 'carotte', 'salade' ]

console.log(fruits); // ['pomme ', 'poire'];
console.log(legumes); // ['carotte ', 'salade'];

Como vês, esta forma de escrever não toca nem altera o array existente.

Qual escolher?

Vamos pôr as duas versões lado a lado para as poderes comparar.

javascript
// Versão A:
const combinedA = [].concat(fruits, legumes);

// Versão B:
const combinedB = fruits.concat(legumes);

A pergunta agora é qual delas escolher. Prefiro a versão A, porque acho a intenção bem mais clara. Basta olhar para ela para saber que estou a criar um novo array e que não mexo no que já existe. Já na versão B, parece que estou a acrescentar legumes ao array fruits, e não me é nada evidente que o array fruits possa acabar substituído pelos legumes.

Diferença entre spread e concat

Prefiro usar o spread porque o acho mais conciso e mais fácil de escrever. MAS o concat continua a ter as suas vantagens.

O spread é fantástico quando sabes de antemão que estás a lidar com arrays. Só que a origem pode ser outra coisa, uma string por exemplo, e tu queres acrescentar essa string ao array. Vejamos um exemplo.

Exemplo

Digamos que é este o resultado que queremos:

javascript
[1, 2, 3, 'random'];

A. Com o spread

Se seguirmos o modelo que já usámos e aplicarmos o operador spread, acontece isto:

javascript
function combineArray(array1, array2) {
return [...array1, ...array2];
}

const isArray = [1, 2, 3];
const notArray = 'random';

combineArray(isArray, notArray);
// [ 1, 2, 3, 'r', 'a', 'n', 'd', 'o', 'm' ]

Ao espalhar a nossa string, a palavra fica dividida em letras separadas. Não é o resultado que queríamos.

B. Com o concat

MAS, se seguirmos o modelo do concat, acontece isto:

javascript
function combineArray(array1, array2) {
return [].concat(array1, array2);
}

const isArray = [1, 2, 3];
const notArray = 'random';

combineArray(isArray, notArray);
// [ 1, 2, 3, 'random' ]

Excelente! Temos o resultado que queríamos.

Já sei o que alguns estão a pensar: «bah!». Escrevo uma condição para garantir que aquilo que passo é mesmo um array e trato o caso em conformidade. Claro que também funciona. Ou então escreves menos código e usas concat.

Veredicto

A regra rápida é esta: se sabes que estás a lidar com arrays, usa o spread. Mas se houver a hipótese de te aparecer algo que não é um array, usa antes o concat para fundir o array.

Seja como for, queria só deixar isto claro, para que possas usar o método mais adequado ao problema que estás a resolver.

Unir dois arrays com push

Talvez estejas a perguntar-te se também não podes usar o push para juntar arrays. E podes! Mas o push toca e altera o array existente: NÃO cria um array novo. Depende, portanto, daquilo que queres fazer. Guarda isso bem.

javascript
const fruits = ['pomme ', 'poire'];
const legumes = ['carotte ', 'salade'];

const combined = fruits.push(...legumes);

console.log(combined); // 4
// quando usas o push, ele devolve o COMPRIMENTO do array combinado

console.log(fruits); // [ 'pomme', 'poire', 'carotte', 'salade' ]
console.log(legumes); // ['carotte', 'salade']

E quando tentas empurrar um array para dentro de outro array, tens de o espalhar, senão acabas com um array aninhado. A não ser, claro, que seja isso que queres

javascript
const fruits = ['pomme ', 'poire'];
const legumes = ['carotte ', 'salade'];

cars.push(legumes);
// fruits: [ 'pomme ', 'poire', ['carotte ', 'salade'] ]

cars.push(...legumes);
// fruits: [ 'pomme ', 'poire', 'carotte ', 'salade' ]

Suporte dos browsers

O spread chegou com o ES6, por isso todos os browsers modernos o suportam. Caso contrário, usa o concat no seu lugar ou passa por um compilador como o Babel.

JavaScript

Damien Flandrin Programador web desde 2010, criador da Gekkode e do Email Impact. Cada artigo é testado num projeto real antes de ser publicado. Contacto
Newsletter

Os novos testes, tutoriais e projetos, por e-mail.

Testes reproduzíveis, código versionado, resultados datados. Nunca spam.