54

複数のアレイバッファをマージしてBlobを作成したいと思います。ただし、ご存知のように、 TypedArrayには「プッシュ」または便利なメソッドがありません。

例えば:

var a = new Int8Array( [ 1, 2, 3 ] );
var b = new Int8Array( [ 4, 5, 6 ] );

結果として、取得したいと思います[ 1, 2, 3, 4, 5, 6 ]

4

8 に答える 8

97

メソッドを使用しsetます。ただし、2 倍のメモリが必要になることに注意してください。

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);
于 2012-12-28T15:07:28.837 に答える
9

私はいつもこの機能を使用します:

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;
}
于 2016-02-25T17:15:21.100 に答える
2

複数の型付き配列がある場合

            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;
   }
于 2020-01-24T19:29:36.703 に答える
0

ワンライナーが好きな人向け:

  const binaryData = [
    new Uint8Array([1, 2, 3]),
    new Int16Array([4, 5, 6]),
    new Int32Array([7, 8, 9])
  ];

  const mergedUint8Array = new Uint8Array(binaryData.map(typedArray => [...new Uint8Array(typedArray.buffer)]).flat());
于 2020-09-04T09:40:18.277 に答える