Javascript 如何合并UInt8数组的数组?

Javascript 如何合并UInt8数组的数组?,javascript,arrays,typed-arrays,Javascript,Arrays,Typed Arrays,我有一个由几个UInt8数组组成的数组。 类似于此: [Uint8Array(16384)、Uint8Array(16384)、Uint8Array(16384)、Uint8Array(16384)、Uint8Array(16384)、Uint8Array(8868)] 如何将它们合并/连接/连接(不确定正确的术语是什么)到单个ArrayBuffer 这里的关键是我需要的输出必须是ArrayBuffer。您可以使用set方法。创建具有所有大小的新类型数组。 例如: var arrayOne =

我有一个由几个UInt8数组组成的数组。 类似于此:

[Uint8Array(16384)、Uint8Array(16384)、Uint8Array(16384)、Uint8Array(16384)、Uint8Array(16384)、Uint8Array(8868)]

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


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

您可以使用
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);
替代方法:将键入的数组转换为“普通”数组。concat并再次创建它的类型数组

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


这对我很有用:单_数组就是你想要的

 var arrays = [Uint8Array(16384), Uint8Array(16384), Uint8Array(16384), Uint8Array(16384), Uint8Array(16384), Uint8Array(8868)]



 var single_array = concat(arrays)


function concat(arrays) {
  // sum of individual array lengths
  let totalLength = arrays.reduce((acc, value) => acc + value.length, 0);

  if (!arrays.length) return null;

   let result = new Uint8Array(totalLength);

      // for each array - copy it over result
      // next array is copied right after the previous one
      let length = 0;
      for(let array of arrays) {
            result.set(array, length);
            length += array.length;
      }

      return result;
   }

只需将其视为任何普通阵列:

var concatArray = new Uint8Array([ ...Uint8Array1, ...Uint8Array2, ...Uint8Array3 ]);

您可以使用一个helper函数以提供的顺序连接任意长度的数组

这看起来很好,很干净,但它也会在每次迭代时复制
acc
,因为spread运算符:

// arrays are Uint8Array[]
(arrays) => new Uint8Array(arrays.reduce((acc, curr) => [...acc, ...curr], []));
这看起来稍微长一点,但性能更高,因为
acc
不会在每次迭代中传播,而是推送到并返回:

// arrays are Uint8Array[]
(arrays) => {
  const flatNumberArray = arrays.reduce((acc, curr) => {
    acc.push(...curr);
    return acc;
  }, []);

  return new Uint8Array(flatNumberArray);
};

一个错误:
offset=
应该是
offset+=
。还有一句主观的评论:第二个循环也可以使用
forEach
mergedArray.set(item,offset);offset+=item.length;
// arrays are Uint8Array[]
(arrays) => {
  const flatNumberArray = arrays.reduce((acc, curr) => {
    acc.push(...curr);
    return acc;
  }, []);

  return new Uint8Array(flatNumberArray);
};