Подтвердить что ты не робот

Как заменить элементы в массиве элементами другого массива

Я хочу заменить элементы в некотором массиве из элемента 0, с элементами другого массива переменной длины. Например:

var arr = new Array(10), anotherArr = [1, 2, 3], result;
result = anotherArr.concat(arr);
result.splice(10, anotherArr.length);

Есть ли лучший способ?

4b9b3361

Ответ 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