Эффективное копирование массива Javascript в другой массив по индексу - PullRequest
0 голосов
/ 22 января 2019

В 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/

Ответы [ 3 ]

0 голосов
/ 22 января 2019

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

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

0 голосов
/ 22 января 2019

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

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);

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

0 голосов
/ 22 января 2019

Попробуйте

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[, ...]]]]).Пример использования в приведенном выше фрагменте

ОБНОВЛЕНИЕ

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

Если ваш массив содержит числа с плавающей запятой, вы можете использовать Float32Array или Uint32array , что почти в 2 раза быстрее, чем Array (сращивание не поддерживается для 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...