Łączenie tablic w JavaScript: spread, concat czy push

Łączenie tablic w JavaScript: spread, concat czy push

Oto 2 sposoby na połączenie tablic i zwrócenie NOWEJ tablicy. Sam najchętniej sięgam po operator spread. Jeśli jednak musisz obsłużyć starsze przeglądarki, lepiej wybrać concat.

javascript
// 2 sposoby na łączenie tablic

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

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

// Metoda 2: Spread
const combined2 = [...fruits, ...legumes];

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

Alternatywny zapis concat

Ten sam concat możesz zapisać również tak:

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'];

Jak widzisz, ten zapis nie rusza istniejącej tablicy ani jej nie modyfikuje.

Który wybrać?

Zestawmy obie wersje obok siebie, żeby dało się je porównać.

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

// Wersja B:
const combinedB = fruits.concat(legumes);

Zostaje więc pytanie, którą wybrać. Wolę wersję A, bo intencja jest w niej znacznie czytelniejsza. Wystarczy na nią spojrzeć, żeby wiedzieć, że tworzę nową tablicę i nie ruszam istniejącej. Kiedy patrzę na wersję B, mam za to wrażenie, że dopisuję legumes do tablicy fruits, i wcale nie jest oczywiste, że tablica fruits może zostać nadpisana przez legumes.

Różnica między spread a concat

Wolę spread, bo jest zwięźlejszy i szybciej się go pisze. ALE concat wciąż ma swoje zalety.

Spread jest znakomity, kiedy z góry wiesz, że masz do czynienia z tablicami. Co jednak, gdy źródłem jest coś innego, na przykład ciąg znaków, który chcesz dołożyć do tablicy? Weźmy przykład.

Przykład

Powiedzmy, że chcemy uzyskać taki wynik:

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

A. Ze spreadem

Jeśli pójdziemy schematem z poprzedniego przykładu i użyjemy operatora spread, dzieje się to:

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' ]

Rozłożenie ciągu znaków rozbija słowo na pojedyncze litery. To nie jest wynik, o który nam chodziło.

B. Z concatem

ALE jeśli pójdziemy schematem z concat, dzieje się to:

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

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

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

Świetnie, dostajemy dokładnie ten wynik, o który nam chodziło.

Wiem, że część z was myśli teraz „E tam!”. Napiszę sobie warunek, sprawdzę, czy to, co przekazuję, jest tablicą, i obsłużę to odpowiednio. Jasne, to też działa. Albo napisz mniej kodu i użyj concat.

Werdykt

Szybka zasada brzmi tak. Jeśli wiesz, że pracujesz na tablicach, użyj spread. Jeśli natomiast może ci się trafić coś innego niż tablica, do połączenia sięgnij po concat.

Tak czy inaczej, chciałem to zasygnalizować, żebyś dobierał metodę do problemu, który akurat rozwiązujesz.

Łączenie tablic przez push

Część z was zastanawia się pewnie, czy do łączenia tablic nie da się użyć push. Da się! Tyle że push modyfikuje istniejącą tablicę. NIE tworzy nowej. Wszystko zależy więc od tego, co chcesz osiągnąć, miej to na uwadze.

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

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

console.log(combined); // 4
// gdy używasz push, zwraca on DŁUGOŚĆ połączonej tablicy

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

Poza tym, kiedy wrzucasz jedną tablicę do drugiej, musisz ją rozłożyć, inaczej skończysz z tablicą zagnieżdżoną. No chyba że właśnie o to ci chodziło.

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' ]

Wsparcie przeglądarek

Spread pojawił się w ES6, więc obsługują go wszystkie nowoczesne przeglądarki. W pozostałych przypadkach użyj concat albo kompilatora w rodzaju Babel.

JavaScript

Damien Flandrin Web developer od 2010 roku, twórca Gekkode i Email Impact. Każdy artykuł jest sprawdzany na prawdziwym projekcie przed publikacją. Kontakt
Newsletter

Nowe testy, poradniki i projekty — e-mailem.

Powtarzalne testy, wersjonowany kod, datowane wyniki. Nigdy spamu.