在Javascript中将一个数组复制到另一个更大的数组的中间

6

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

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

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

我想要用arr1替换arr2从第四个位置开始的内容。这样arr2将会变成:
arr2 = [0,1,2,0,0,0,6,7,8,9];

如果我不是在数组中间尝试这样做,我可以像这样使用set

arr2.set(arr1);

我会得到:

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

我知道可以循环arr2并逐个复制值,但从性能上来说,与set相比,这非常缓慢(由于它每秒钟复制24次整个画布img数据数组)。

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


第四个位置是随机位置还是它总是在第四个位置? - Sagiv b.g
@Sagivb.g 根据输入数据生成随机数,但是我会提前定义一个变量来引用该位置。 - YAHsaves
或许 set 本身具有相同的性能表现! - Eineki
@Eineki,不好意思,我测试过多次了。使用集合的性能远胜于循环数组。在大型数组上,它的速度快近300%。 - YAHsaves
@YAHsaves 或许我表达不太清楚。我的意思是你应该使用 set() 方法本身,因为它有一个可选的 offset 参数,可以用来做你需要的事情。 - Eineki
3个回答

4

使用typedarray.set(array[, offset])方法中的offset参数。

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


@OriDrori,新年快乐! - Nina Scholz
1
@NinaScholz - 新年快乐 :) - Ori Drori

2
您可以使用 slice 方法以及 扩展语法

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


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接