在Javascript中将数组复制到较大数组的中间

时间:2017-12-31 23:56:33

标签: javascript arrays

我在这里搜索了答案,但我只能找到其他语言的问题。

所以我有2个Uint8类型的数组。

var arr1 = [0,0,0];
var arr2 = [0,1,2,3,4,5,6,7,8,9];

我想从第4个位置开始用arr1替换arr2的内容。所以arr2将是:

arr2 = [0,1,2,0,0,0,6,7,8,9];

如果我没有尝试在数组中间执行此操作,我可以使用set like this

arr2.set(arr1);

我会得到:

arr2 = [0,0,0,4,5,6,7,8,9];

我知道我可以循环遍历arr2并单独复制值,但性能方面这与set相比非常慢(并且性能对我很重要,因为它每秒24次复制整个canvas画布img数据)。 / p>

是否有任何函数可以复制到数组的中间,但具有set的性能?

3 个答案:

答案 0 :(得分:4)

使用typedarray.set(array[, offset])偏移。

  

偏移可选

     

要开始的目标数组的偏移量   从源数组中写入值。如果省略此值,则为0   假设(也就是说,源数组将覆盖目标中的值   从索引0开始的数组。

const arr1 = new Uint8Array([0,0,0]);
const arr2 = new Uint8Array([0,1,2,3,4,5,6,7,8,9]);

arr2.set(arr1, 4);

console.log(arr2);

答案 1 :(得分:2)

您可以将slice方法与spread syntax

一起使用

const shim = (source, index, target) => [
  ...source.slice(0, index),
  ...target,
  ...source.slice(index)
]

var arr1 = [0,0,0];
var arr2 = [0,1,2,3,4,5,6,7,8,9];

const newArr = shim(arr2, 3, arr1);
console.log(newArr);

.slice不会改变数组,并会返回一个新的浅表副本(与splice不同)。

答案 2 :(得分:1)

由于您使用的是类型化数组。你不能使用set方法的偏移量吗?

arr2.set(arr1, 3)

从目标数组的第4个元素覆盖。  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/TypedArray/set

如果我理解你的问题,对我来说它就是你所需要的。