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

44
3

В javascript, допустим, у меня есть предварительно выделенный массив из n элементов, и у меня есть еще один массив, который я хочу скопировать в первый массив с заданным начальным индексом. Ниже приведен один из способов сделать это:

let arr = new Array(25);
console.log(arr);

let arrB = Array(5).fill(1);
let insertAt = 5;
for(let ix = 0; ix < arrB.length; ix++)
arr[ix + insertAt] = arrB[ix];
console.log(arr);

Есть ли более эффективный/стандартный способ сделать это?

Я думаю о чем-то эквивалентном следующему в C++: http://www.cplusplus.com/forum/general/199358/

спросил(а) 2019-01-22T02:49:00+03:00 10 месяцев, 2 недели назад
3
Решение
44

Эффективность мудрая, я не думаю, что есть лучший способ, чем код, который вы опубликовали. Вам нужно будет просмотреть все элементы массива, которые необходимо скопировать.

Я согласен с другими в том, что использование slice, вероятно, является стандартным способом сделать это.

ответил(а) 2019-01-22T03:26:00+03:00 10 месяцев, 2 недели назад
Еще 2 ответа
33

Я сделал модуль, чтобы сделать это проще:

const checks = require("checks"); //NB, NOT ON NPM....

(()=>{
Array.prototype.copyInto = function(arr,ix = 0){
if(!checks.isArray(arr))
throw new Error("'arr' argument must be an array");
if(!checks.isInteger(ix) || ix < 0)
throw new Error("'ix' must be a positive integer");
for(let i = 0; i < arr.length; i++)
this[ix+i] = arr[i];
return this;
}
})();

а это значит, что его можно использовать так:


let x = Array(5).fill(0).copyInto([1,1],2);
console.log(x);

Не уверен, что это правильный подход, но он работает для меня.

ответил(а) 2019-01-22T05:56:00+03:00 10 месяцев, 2 недели назад
-3

Пытаться

arr.splice(insertAt,5, ...arrB)

let arr = new Array(25);
console.log(arr);

let arrB = Array(5).fill(1);
let insertAt = 5;

arr.splice(insertAt,5, ...arrB)
console.log(arr);

Следование документации MDN Метод splice() изменяет содержимое массива путем удаления или замены существующих элементов и/или добавления новых элементов. синтаксис: arr.splice(start[, deleteCount[, item1[, item2[,...]]]]). Пример использования в приведенном выше фрагменте

ОБНОВИТЬ

Действительно, сращивание является стандартным способом, но это медленнее, чем для цикла - я выполняю тест, чтобы проверить это ЗДЕСЬ. Сращивание на ~ 28% медленнее, чем для цикла.

Если ваш массив содержит числа с плавающей точкой, вы можете использовать Float32Array или Uint32array, что почти в 2 раза быстрее, чем Array (splice не поддерживается для chrome)

let arr = new Float32Array(25);
console.log(arr);
let arrB = new Float32Array(5).fill(1);

let insertAt = 5;
for(let ix = 0; ix < arrB.length; ix++)
arr[ix + insertAt] = arrB[ix];
console.log(arr);

ОБНОВЛЕНИЕ 2

Я читаю ваш ответ и сравниваю с Uint32Array (в случае, если вы хотите использовать массив с целыми числами) - он в 2 раза быстрее обычного массива - здесь.

Uint32Array.prototype.copyInto = function(arr,ix = 0) {    
for(let i = 0; i < arr.length; i++)
this[ix+i] = arr[i];
return this;
}

let a = new Uint32Array(2).fill(1);
let x = new Uint32Array(5).fill(0).copyInto(a,2);
console.log(x);

ответил(а) 2019-01-22T02:56:00+03:00 10 месяцев, 2 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема