
Работа с массивами в JavaScript часто требует объединения данных из разных источников. Например, при обработке ответа от нескольких API или при объединении пользовательских данных с заранее определёнными значениями. Для этого язык предоставляет несколько инструментов с разными характеристиками по скорости и удобству записи.
Метод concat() остаётся самым очевидным решением. Он создаёт новый массив, объединяя переданные массивы, и не изменяет исходные данные. Такой подход полезен, если важно сохранить оригинальные коллекции.
Оператор spread (…) используется всё чаще, так как даёт более короткую запись и позволяет объединять массивы в одну строку. Дополнительно его можно комбинировать с другими элементами: например, вставлять массив внутрь списка значений или объединять сразу несколько массивов в любом порядке.
В случаях, когда необходимо не только объединить, но и удалить дубликаты, разработчики часто применяют связку spread и Set. Такой способ позволяет получить новый массив уникальных значений без написания дополнительных циклов или фильтрации.
Объединение массивов с помощью concat()

Метод concat() создаёт новый массив, не изменяя исходные. Он может объединять несколько массивов или добавлять отдельные значения.
Синтаксис:
const result = array1.concat(array2, array3, ... , valueN);
Пример объединения двух массивов:
const a = [1, 2];
const b = [3, 4];
const c = a.concat(b);
// [1, 2, 3, 4]
Можно соединять больше двух массивов:
const x = [10];
const y = [20, 30];
const z = [40];
const merged = x.concat(y, z);
// [10, 20, 30, 40]
Добавление отдельных значений:
const base = ['a', 'b'];
const result = base.concat('c', ['d', 'e']);
// ['a', 'b', 'c', 'd', 'e']
Сравнение concat() с другими способами:
| Метод | Изменяет исходный массив | Возвращает новый массив | Поддерживает добавление отдельных значений |
|---|---|---|---|
| concat() | Нет | Да | Да |
| spread (…) | Нет | Да | Да |
| push() | Да | Нет | Да |
concat() предпочтителен, если нужно сохранить оригинальные массивы без изменений.
Использование оператора расширения для объединения
Оператор расширения (…) позволяет развернуть элементы массива в новом массиве. Это даёт возможность быстро объединять несколько массивов без использования дополнительных методов.
Пример объединения двух массивов:
const arr1 = [1, 2, 3];
const arr2 = [4, 5];
const result = [...arr1, ...arr2];
console.log(result); // [1, 2, 3, 4, 5]
Можно добавлять элементы в произвольные позиции:
const base = [10, 20];
const combined = [0, ...base, 30];
console.log(combined); // [0, 10, 20, 30]
При объединении вложенных массивов оператор расширения работает только с верхним уровнем. Глубокое копирование не выполняется, и объекты внутри сохраняют ссылки:
const nested = [[1], [2]];
const copy = [...nested];
copy[0][0] = 99;
console.log(nested[0][0]); // 99
Использование расширения подходит для небольших и средних массивов. При работе с очень крупными данными стоит учитывать потребление памяти и возможные задержки при разворачивании.
Слияние массивов с сохранением вложенной структуры

Если массивы содержат вложенные элементы, простое объединение с помощью concat или оператора spread приведёт к их последовательному добавлению, но не к слиянию вложенных структур. Для корректного объединения требуется рекурсивный подход.
Пример функции:
function deepMergeArrays(a, b) {
return a.map((item, index) => {
if (Array.isArray(item) && Array.isArray(b[index])) {
return deepMergeArrays(item, b[index]);
}
return b[index] !== undefined ? b[index] : item;
}).concat(b.slice(a.length));
}
В этом примере каждый элемент проверяется: если оба значения являются массивами, выполняется рекурсивное слияние. Если элемент в массиве b присутствует, он заменяет значение из a. Если индексы выходят за пределы массива a, добавляются новые элементы из b.
Подобный метод применим при объединении структурированных данных, например, иерархических списков или многоуровневых настроек, где важно сохранить вложенность.
Удаление дубликатов при объединении массивов
Пример:
const a = [1, 2, 3];
const b = [2, 3, 4];
const result = [...new Set([...a, ...b])];
console.log(result); // [1, 2, 3, 4]
Если требуется сохранить порядок добавления, Set подходит идеально. Для сохранения уникальности по условию, например по свойству объекта, используют метод filter с индексной проверкой:
const usersA = [{id:1,name:'Анна'},{id:2,name:'Иван'}];
const usersB = [{id:2,name:'Иван'},{id:3,name:'Ольга'}];
const merged = [...usersA, ...usersB]
.filter((user, index, arr) =>
index === arr.findIndex(u => u.id === user.id)
);
console.log(merged);
// [{id:1,name:'Анна'},{id:2,name:'Иван'},{id:3,name:'Ольга'}]
Для больших наборов данных эффективнее применять Map, где ключом служит уникальный идентификатор. Это избавляет от вложенных проходов по массиву:
const merged = new Map();
[...usersA, ...usersB].forEach(u => merged.set(u.id, u));
console.log([...merged.values()]);
Выбор подхода зависит от типа данных: для примитивов лучше использовать Set, для объектов – Map или filter с проверкой уникального свойства.
Объединение массивов с различными типами данных

JavaScript позволяет объединять массивы, содержащие элементы разных типов: строки, числа, объекты, булевы значения. Важно учитывать, что при использовании concat() или оператора spread (…) элементы сохраняют исходный тип без преобразований.
Пример:
const arr1 = [1, "текст"];
const arr2 = [true, {id: 5}];
const result = [...arr1, ...arr2];
console.log(result);
// [1, "текст", true, {id: 5}]
При объединении объектов внутри массива необходимо помнить, что объекты и массивы копируются по ссылке. Изменение вложенного объекта отразится во всех массивах, где он используется.
Если требуется приведение к одному типу, следует явно использовать функции преобразования, например String(), Number() или Boolean(). Это особенно полезно при подготовке данных для сериализации или сортировки.
Для фильтрации и приведения типов после объединения можно использовать методы map() и filter(). Например, преобразовать все элементы в строки:
const arr = [1, true, "текст"];
const normalized = arr.map(String);
console.log(normalized);
// ["1", "true", "текст"]
Таким образом, объединение массивов с разными типами возможно напрямую, но для дальнейшей обработки лучше заранее продумать правила нормализации.
Формирование нового массива без изменения исходных

В JavaScript при объединении массивов часто требуется сохранить исходные данные без изменений. Для этого применяются методы, создающие новый массив.
Наиболее распространенные способы:
- Метод
concat(): объединяет два или более массивов, возвращая новый. Исходные массивы остаются неизменными. - Оператор расширения
...: позволяет собрать элементы нескольких массивов в новый массив с сохранением порядка.
Примеры:
-
Использование
concat():const arr1 = [1, 2]; const arr2 = [3, 4]; const combined = arr1.concat(arr2); // arr1 = [1, 2] // arr2 = [3, 4] // combined = [1, 2, 3, 4] -
Использование оператора расширения:
const arr1 = ['a', 'b']; const arr2 = ['c', 'd']; const combined = [...arr1, ...arr2]; // arr1 = ['a', 'b'] // arr2 = ['c', 'd'] // combined = ['a', 'b', 'c', 'd']
Дополнительно:
- Для объединения массивов с вложенными структурами используйте глубокое копирование, иначе ссылки на объекты сохранятся.
- Если нужно объединить более двух массивов,
concat()допускает передачу нескольких аргументов:arr1.concat(arr2, arr3). - Оператор
...удобен при динамическом формировании массива:const combined = [...arr1, ...dynamicArray].
Применение этих подходов гарантирует, что исходные массивы остаются неизменными, что важно при работе с данными, которые используются в нескольких местах программы.
Объединение массивов внутри функций и циклов

В JavaScript объединение массивов внутри функций позволяет динамически формировать новые коллекции на основе входных данных. Например, использование concat() внутри функции обеспечивает создание нового массива без изменения исходных:
Пример:
function mergeArrays(arr1, arr2) {
return arr1.concat(arr2);
}
const result = mergeArrays([1, 2], [3, 4]); // [1, 2, 3, 4]
Для итеративного объединения нескольких массивов удобно применять циклы. forEach позволяет добавлять элементы из нескольких источников в один массив:
Пример:
const arrays = [[1, 2], [3, 4], [5]];
let merged = [];
arrays.forEach(arr => merged = merged.concat(arr));
console.log(merged); // [1, 2, 3, 4, 5]
При необходимости производить объединение с изменением исходного массива эффективнее использовать push с оператором spread:
Пример:
let target = [1, 2];
const sources = [[3, 4], [5, 6]];
sources.forEach(arr => target.push(...arr));
console.log(target); // [1, 2, 3, 4, 5, 6]
Функции могут возвращать объединённый массив напрямую в цикле for…of, что удобно при обработке больших наборов данных и динамически создаваемых массивов:
Пример:
function combineAll(arrays) {
let result = [];
for (const arr of arrays) {
result = result.concat(arr);
}
return result;
}
console.log(combineAll([[1], [2, 3], [4]])); // [1, 2, 3, 4]
Использование этих подходов позволяет контролировать порядок элементов, избегать нежелательных мутаций исходных массивов и гибко интегрировать объединение в любые функции и циклы.
Вопрос-ответ:
Какими способами можно объединить два массива в JavaScript?
В JavaScript есть несколько способов объединить массивы. Самый распространённый — метод concat, который создаёт новый массив, включающий элементы обоих массивов. Ещё можно использовать оператор расширения (...) для объединения массивов в новый: let combined = [...arr1, ...arr2];. Также возможна модификация одного из исходных массивов через метод push с оператором расширения: arr1.push(...arr2);. Выбор зависит от того, нужен ли новый массив или можно изменять существующий.
Как объединить несколько массивов одновременно?
Если требуется соединить больше двух массивов, удобнее использовать оператор расширения. Например: let result = [...arr1, ...arr2, ...arr3];. Такой способ легко масштабируется на любое количество массивов. Альтернативно можно применять concat с несколькими аргументами: let result = arr1.concat(arr2, arr3, arr4);. Этот метод тоже создаёт новый массив и не изменяет исходные.
Что происходит с вложенными массивами при объединении?
Методы объединения, такие как concat и оператор расширения, объединяют массивы только на первом уровне. Если в исходных массивах есть вложенные массивы, они будут включены как отдельные элементы, а не развернуты. Например, [1, [2, 3]].concat([4, 5]) даст [1, [2, 3], 4, 5]. Чтобы объединять вложенные массивы, потребуется дополнительная обработка, например, с помощью рекурсивной функции или метода flat.
Можно ли объединять массивы с объектами и другими типами данных?
Да, массивы могут содержать любые типы данных, включая числа, строки, объекты и даже другие массивы. Методы concat и оператор расширения корректно объединяют такие массивы, сохраняя типы элементов. Например, [1, {a: 2}].concat(["text", [3, 4]]) вернёт [1, {a: 2}, "text", [3, 4]]. При этом объекты и вложенные массивы передаются по ссылке, а не копируются полностью.
