如何合并一组 Uint8Arrays?

Mar*_*lov 13 javascript arrays typed-arrays

我有一个由几个 Uint8Array 组成的数组。类似的东西:

[Uint8Array(16384), Uint8Array(16384), Uint8Array(16384), Uint8Array(16384), Uint8Array(16384), Uint8Array(8868)]

我如何将它们合并/连接/加入(不确定正确的术语是什么)到单个 ArrayBuffer?

这里的关键是我需要的输出必须是一个 ArrayBuffer。

Dom*_*nik 12

您可以使用该set方法。创建一个具有所有大小的新类型化数组。例子:

var arrayOne = new Uint8Array([2,4,8]);
var arrayTwo = new Uint8Array([16,32,64]);

var mergedArray = new Uint8Array(arrayOne.length + arrayTwo.length);
mergedArray.set(arrayOne);
mergedArray.set(arrayTwo, arrayOne.length);
Run Code Online (Sandbox Code Playgroud)

替代方法:将类型化数组转换为“普通”数组。连接它并再次创建它的类型数组。

在您的情况下(解决方案):

let myArrays = [new Uint8Array(16384), new Uint8Array(16384), new Uint8Array(16384), new Uint8Array(16384), new Uint8Array(16384), new Uint8Array(8868)];

// Get the total length of all arrays.
let length = 0;
myArrays.forEach(item => {
  length += item.length;
});

// Create a new array with total length and merge all source arrays.
let mergedArray = new Uint8Array(length);
let offset = 0;
myArrays.forEach(item => {
  mergedArray.set(item, offset);
  offset += item.length;
});

// Should print an array with length 90788 (5x 16384 + 8868 your source arrays)
console.log(mergedArray);
Run Code Online (Sandbox Code Playgroud)

  • 这比使用扩展语法快 10 倍。https://jsben.ch/jze3P (3认同)
  • 一个错误:``offset =```` 应​​该是````offset +=```。还有一个主观评论:你也可以在第二个循环中使用 ```forEach``` (```mergedArray.set(item,offset);offset+=item.length;```) (2认同)

Nei*_*eil 7

就像对待任何普通数组一样对待它:

var concatArray = new Uint8Array([ ...Uint8Array1, ...Uint8Array2, ...Uint8Array3 ]);
Run Code Online (Sandbox Code Playgroud)

  • 请参阅 @Dominik 提出的扩展语法与 set 方法的性能比较:https://jsben.ch/jze3P (16认同)
  • 在上面的性能测试中,mergedArray.set 只比扩展语法好 27 倍。简单的。 (5认同)