如何合并Uint8Arrays数组?

时间:2018-03-06 11:21:20

标签: javascript arrays typed-arrays

我有几个Uint8Arrays的数组。 类似的东西:

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

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

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

4 个答案:

答案 0 :(得分:3)

您可以使用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);

替代方案:将您键入的数组转换为" normal"阵列。连接它并再次创建它的类型数组。

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:0)

这对我有用:single_array是您想要的

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

答案 3 :(得分:0)

您可以具有一个辅助函数,以提供的顺序连接任意长度的数组。

这看起来很干净,但是由于使用了传播运算符,它还在每次迭代中复制了def count_ones(num): x=0 for i in bin(num): if list(bin(num))[i] ==1: x += 1 return x

acc

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

acc