我想合并多个数组缓冲区来创建一个 Blob。但是,如您所知, TypedArray没有“推送”或有用的方法......
例如:
var a = new Int8Array( [ 1, 2, 3 ] );
var b = new Int8Array( [ 4, 5, 6 ] );
结果,我想得到[ 1, 2, 3, 4, 5, 6 ].
我想合并多个数组缓冲区来创建一个 Blob。但是,如您所知, TypedArray没有“推送”或有用的方法......
例如:
var a = new Int8Array( [ 1, 2, 3 ] );
var b = new Int8Array( [ 4, 5, 6 ] );
结果,我想得到[ 1, 2, 3, 4, 5, 6 ].
使用set方法。但请注意,您现在需要两倍的内存!
var a = new Int8Array( [ 1, 2, 3 ] );
var b = new Int8Array( [ 4, 5, 6 ] );
var c = new Int8Array(a.length + b.length);
c.set(a);
c.set(b, a.length);
console.log(a);
console.log(b);
console.log(c);
对于客户端 ~ok 解决方案:
const a = new Int8Array( [ 1, 2, 3 ] )
const b = new Int8Array( [ 4, 5, 6 ] )
const c = Int8Array.from([...a, ...b])
我总是使用这个功能:
function mergeTypedArrays(a, b) {
    // Checks for truthy values on both arrays
    if(!a && !b) throw 'Please specify valid arguments for parameters a and b.';  
    // Checks for truthy values or empty arrays on each argument
    // to avoid the unnecessary construction of a new array and
    // the type comparison
    if(!b || b.length === 0) return a;
    if(!a || a.length === 0) return b;
    // Make sure that both typed arrays are of the same type
    if(Object.prototype.toString.call(a) !== Object.prototype.toString.call(b))
        throw 'The types of the two arguments passed for parameters a and b do not match.';
    var c = new a.constructor(a.length + b.length);
    c.set(a);
    c.set(b, a.length);
    return c;
}
不检查 null 或类型的原始函数
function mergeTypedArraysUnsafe(a, b) {
    var c = new a.constructor(a.length + b.length);
    c.set(a);
    c.set(b, a.length);
    return c;
}
如果我有多个类型化数组
            arrays = [ typed_array1, typed_array2,..... typed_array100]
我想将所有 1 到 100 个子数组连接到单个“结果”中,这个函数对我有用。
  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;
   }
作为一个单行,它将采用任意数量的数组(myArrays此处)和混合类型,只要结果类型全部采用(Int8Array此处):
let combined = Int8Array.from(Array.prototype.concat(...myArrays.map(a => Array.from(a))));