Javascript有效复制数组到索引处的另一个数组

时间:2019-01-21 23:49:53

标签: javascript arrays copy

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

4 个答案:

答案 0 :(得分:1)

出于效率考虑,我认为没有比您发布的代码更好的方法了。您将需要遍历数组中所有需要复制的项目。

我同意其他观点,因为使用slice可能是这样做的标准方法。

答案 1 :(得分:1)

不确定该代码的性能如何(仍然是一名学习者),但提出了将其作为实现这种结果的另一种方法。

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

function copy(index) {
    if (arrB.length === 0 || index > 9) {
        return;
    }

    arr[index] = arrB.shift();
    copy(index + 1);
}

copy(insertAt);

答案 2 :(得分:0)

我最终制作了一个模块来简化此操作:

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

不确定这是否正确,但这对我有用。

答案 3 :(得分:-1)

尝试

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 documentation splice()方法通过删除或替换现有元素和/或添加新元素来更改数组的内容。语法:arr.splice(start[, deleteCount[, item1[, item2[, ...]]]])。上面片段中的示例用法

更新

独立的拼接是标准方式,但是比for循环慢-我执行测试来检查它HERE。拼接比for循环慢约28%。

如果您的数组包含浮点数,则可以使用Float32ArrayUint32array,其速度几乎是Array的2倍(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

我读了answer,并与Uint32Array进行了比较(如果您希望使用带整数的数组)-它比普通数组-here快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);