12

Скопировать элементы массива в другой массив

13

У меня есть массив 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 ответ(ов)

6

Если ваши массивы не слишком большие (см. предупреждение ниже), вы можете использовать метод 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]);
    }
};
0

Самый простой способ, который мне кажется, выглядит следующим образом:

var newArray = dataArray1.slice();
newArray.push.apply(newArray, dataArray2);

Поскольку метод push принимает переменное количество аргументов, вы можете использовать метод apply для функции push, чтобы добавить все элементы другого массива. Это создает вызов push, где первый аргумент (newArray в данном случае) используется как this, а элементы массива передаются в качестве оставшихся аргументов.

Метод slice в первом выражении получает копию первого массива, так что вы не изменяете его.

Обновление Если вы используете версию JavaScript, в которой доступен метод slice, вы можете упростить выражение push до следующего вида:

newArray.push(...dataArray2);
0

В 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(), который может быть эффективнее и требовать меньше памяти в некоторых сценариях. Всегда полезно профилировать производительность в вашем конкретном случае.

0

Да, ваш код решает задачу объединения массивов в JavaScript. Вы создаёте три массива: a, b и d, а затем используете метод concat для объединения массивов a, b и d в новый массив c. В результате, массив c будет содержать элементы всех трёх массивов (['a', 'b', 'c', 'd', 'e', 'f', 'x', 'y', 'z']). Если ваша цель заключалась в том, чтобы объединить эти массивы, то вы всё сделали правильно.

Если у вас есть дополнительные вопросы или нужно уточнить, дайте знать!

0

Вот два простых способа объединения массивов в 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(), который создает новый массив, объединяя элементы двух массивов.

Оба метода позволяют объединить массивы, выберите тот, который лучше подходит под вашу задачу!

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь