Как заменить элементы в массиве элементами другого массива
Я хочу заменить элементы в некотором массиве из элемента 0, с элементами другого массива переменной длины. Например:
var arr = new Array(10), anotherArr = [1, 2, 3], result;
result = anotherArr.concat(arr);
result.splice(10, anotherArr.length);
Есть ли лучший способ?
Ответы
Ответ 1
Вы можете использовать метод splice
для замены части массива элементами из другого массива, но вы должны вызвать его особым образом, поскольку он ожидает, что элементы будут параметрами, а не массивом.
Метод splice
ожидает таких параметров, как (0, anotherArr.Length, 1, 2, 3)
, поэтому вам нужно создать массив с параметрами и использовать метод apply
для вызова метода splice
с параметрами:
Array.prototype.splice.apply(arr, [0, anotherArr.length].concat(anotherArr));
Пример:
var arr = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
var anotherArr = [ 1, 2, 3 ];
Array.prototype.splice.apply(arr, [0, anotherArr.length].concat(anotherArr));
console.log(arr);
Вывод:
[ 1, 2, 3, 'd', 'e', 'f', 'g', 'h', 'i', 'j']
Демо: http://jsfiddle.net/Guffa/bB7Ey/
Ответ 2
В ES6 с одной операцией вы можете сделать это, чтобы заменить все содержимое массива:
let a = [1, 2, 3, 4]
let b = [5, 6, 7, 8]
a.splice(0, a.length, ...b)
console.log(a) // -> [5, 6, 7, 8]
Содержимое массива a
будет полностью заменено содержимым b
.
Обратите внимание, что это должно использоваться только в критически важных приложениях, таких как высокая анимация FPS, чтобы избежать создания новых массивов.
Обычно я создавал бы новый массив, поддерживающий неизменность.
EDIT: Я просто понял, что это точно не отвечает на вопрос, но это может помочь некоторым гуглерам.
Ответ 3
Для тех, кто ищет способ заменить все содержимое одного массива на весь контент другого массива, сохраняя исходный массив:
Array.prototype.replaceContents = function (array2) {
//make a clone of the 2nd array to avoid any referential weirdness
var newContent = array2.slice(0);
//empty the array
this.length = 0;
//push in the 2nd array
this.push.apply(this, newContent);
};
Функция прототипа принимает массив как параметр, который будет служить новым содержимым массива, клонирует его, чтобы избежать каких-либо странных ссылочных материалов, опустошает исходный массив и затем толкает в переданном массиве как содержимое. Это сохраняет исходный массив и любые ссылки.
Теперь вы можете просто сделать это:
var arr1 = [1, 2, 3];
var arr2 = [3, 4, 5];
arr1.replaceContents(arr2);
Я знаю, что это не совсем то, что задавал начальный вопрос, но этот вопрос возникает сначала при поиске в google, и я полагал, что кто-то может найти это полезное, поскольку это был необходимый мне ответ.
Ответ 4
Вы можете просто использовать splice, можете добавлять новые элементы при удалении старых:
var arr = new Array(10), anotherArr = [1, 2, 3];
arr.splice.apply(arr, [0, anotherArr.length].concat(anotherArr))
Если вы не хотите изменять массив arr
, вы можете использовать slice, который возвращает неглубокую копию массива
var arr = new Array(10), anotherArr = [1, 2, 3], result = arr.slice(0);
result.splice.apply(result, [0, anotherArr.length].concat(anotherArr));
В качестве альтернативы вы можете использовать slice
для отсечения первых элементов и добавления anotherArr
на top
:
result = anotherArr.concat(arr.slice(anotherArr.length));
Ответ 5
В ES6, TypeScript, Babel или аналогичном вы можете просто сделать:
arr1.length = 0; // Clear your array
arr1.push(...arr2); // Push the second array using the spread opperator
Simple.
Ответ 6
Я не уверен, что это "лучший" способ, но по крайней мере он позволяет вам выбрать начальный индекс (тогда как ваше решение работает только с индекса 0). Здесь скрипка.
// Clone the original array
var result = arr.slice(0);
// If original array is no longer needed, you can do with:
// var result = arr;
// Remove (anotherArr.length) elements starting from index 0
// and insert the elements from anotherArr into it
Array.prototype.splice.apply(result, [0, anotherArr.length].concat(anotherArr));
(Damnit, так много ниндзя.: -P)
Ответ 7
В этом случае вы можете просто задать длину массива. Для более сложных случаев см. Ответ @Guffa.
var a = [1,2,3];
a.length = 10;
a; // [1, 2, 3, undefined x 7]
Ответ 8
Если вы хотите просто скопировать значения первого массива во второй массив, просто сделайте это
var secondArray = Object.assign([] ,firstArray);
Вот документ Object.assign из Mozilla