Скопировать элементы массива в другой массив
У меня есть массив JavaScript dataArray
, который я хочу добавить в новый массив newArray
. Однако я не хочу, чтобы newArray[0]
содержал сам массив dataArray
. Мне нужно, чтобы в новый массив добавились все элементы:
var newArray = [];
newArray.pushValues(dataArray1);
newArray.pushValues(dataArray2);
// ...
Или даже лучше:
var newArray = new Array (
dataArray1.values(),
dataArray2.values(),
// ... где values() (или что-то эквивалентное) добавляет отдельные значения в массив, а не сам массив
);
Так что теперь новый массив содержит все значения из отдельных массивов данных. Есть ли какой-то короткий способ, подобный pushValues
, который позволит мне избежать итерации по каждому отдельному dataArray
, чтобы добавлять элементы по одному?
5 ответ(ов)
Если ваши массивы не слишком большие (см. предупреждение ниже), вы можете использовать метод push()
для массива, к которому вы хотите добавить значения. Метод push()
может принимать несколько параметров, так что вы можете воспользоваться методом apply()
, чтобы передать массив значений, которые нужно добавить, в качестве списка параметров функции. Это имеет преимущество перед использованием concat()
, так как элементы добавляются непосредственно в массив, а не создается новый массив.
Однако, похоже, что для больших массивов (порядка 100,000 элементов и более) этот трюк может не сработать. В таких случаях лучше использовать цикл. Более подробную информацию можно найти по ссылке: https://stackoverflow.com/a/17368101/96100.
Пример кода:
var newArray = [];
newArray.push.apply(newArray, dataArray1);
newArray.push.apply(newArray, dataArray2);
Вы можете обобщить это в функцию:
function pushArray(arr, arr2) {
arr.push.apply(arr, arr2);
}
... или добавить это в прототип Array
:
Array.prototype.pushArray = function(arr) {
this.push.apply(this, arr);
};
var newArray = [];
newArray.pushArray(dataArray1);
newArray.pushArray(dataArray2);
... или эмулировать оригинальный метод push()
, позволяя передавать несколько параметров, пользуясь тем фактом, что concat()
, как и push()
, также позволяет это:
Array.prototype.pushArray = function() {
this.push.apply(this, this.concat.apply([], arguments));
};
var newArray = [];
newArray.pushArray(dataArray1, dataArray2);
Вот пример версии на основе цикла для последнего случая, подходящий для больших массивов и всех основных браузеров, включая IE ⇐ 8:
Array.prototype.pushArray = function() {
var toPush = this.concat.apply([], arguments);
for (var i = 0, len = toPush.length; i < len; ++i) {
this.push(toPush[i]);
}
};
Самый простой способ, который мне кажется, выглядит следующим образом:
var newArray = dataArray1.slice();
newArray.push.apply(newArray, dataArray2);
Поскольку метод push
принимает переменное количество аргументов, вы можете использовать метод apply
для функции push
, чтобы добавить все элементы другого массива. Это создает вызов push
, где первый аргумент (newArray
в данном случае) используется как this
, а элементы массива передаются в качестве оставшихся аргументов.
Метод slice
в первом выражении получает копию первого массива, так что вы не изменяете его.
Обновление Если вы используете версию JavaScript, в которой доступен метод slice
, вы можете упростить выражение push
до следующего вида:
newArray.push(...dataArray2);
В JavaScript ES6 вы можете использовать оператор ...
, который называется оператором распространения (spread operator). Этот оператор превращает массив в отдельные значения. С помощью него вы можете писать код, похожий на следующий:
const myArray = [1, 2, 3, 4, 5];
const moreData = [6, 7, 8, 9, 10];
const newArray = [
...myArray,
...moreData,
];
Хотя синтаксис выглядит лаконично, вам может быть интересно, как это работает внутренне и какие последствия для производительности могут быть при работе с большими массивами.
Когда вы используете оператор ...
, JavaScript создает новый массив, и для этого он перебирает все элементы входных массивов (myArray
и moreData
). Каждый элемент добавляется в новый массив по одному. Это означает, что в случае больших массивов процесс может занять больше времени и потребовать больше памяти, так как создается новый массив, и JavaScript должен копировать все значения из исходных массивов.
Что касается производительности, использование оператора распространения достаточно быстро для небольших массивов. Однако, если вам необходимо работать с очень большими массивами (например, миллионами элементов), стоит рассмотреть альтернативные подходы, такие как Array.prototype.concat()
, который может быть эффективнее и требовать меньше памяти в некоторых сценариях. Всегда полезно профилировать производительность в вашем конкретном случае.
Да, ваш код решает задачу объединения массивов в JavaScript. Вы создаёте три массива: a
, b
и d
, а затем используете метод concat
для объединения массивов a
, b
и d
в новый массив c
. В результате, массив c
будет содержать элементы всех трёх массивов (['a', 'b', 'c', 'd', 'e', 'f', 'x', 'y', 'z']
). Если ваша цель заключалась в том, чтобы объединить эти массивы, то вы всё сделали правильно.
Если у вас есть дополнительные вопросы или нужно уточнить, дайте знать!
Вот два простых способа объединения массивов в JavaScript:
Решение 1:
let dataArray1 = [0, 1];
let dataArray2 = [2, 3];
dataArray1.push(...dataArray2);
console.log(dataArray1);
В этом варианте мы используем метод push()
с оператором расширения (...
), чтобы добавить элементы из второго массива в первый.
Решение 2:
let dataArray1 = [1, 2];
let dataArray2 = [3, 4];
let newArray = dataArray1.concat(dataArray2);
console.log(newArray);
Здесь применяется метод concat()
, который создает новый массив, объединяя элементы двух массивов.
Оба метода позволяют объединить массивы, выберите тот, который лучше подходит под вашу задачу!
Как перемешать (сделать случайным) массив в JavaScript?
Как объединить два массива в JavaScript и удалить дубликаты?
Как очистить массив в JavaScript?
Как получить доступ к вложенным объектам, массивам или JSON и обработать их?
Как удалить все дубликаты из массива объектов?