14

私はJavascript型付き配列と少し混乱しています。

私が持っているのは、 concatメソッドを持たないいくつかのFloat32Arrayです。ところで、事前にいくつあるかわかりません。それらをすべて別のFloat32Array内に連結したいのですが、次のようになります。

  • 前に言ったように、連結方法はありません
  • 配列の長さを超えて書き込もうとすると、配列は展開されません(これは機能しません-event.frameBufferとbufferは両方ともFloat32Arrayであり、バッファーの最終的な長さがわからないことに注意してください) )::

var length_now = buffer.length;
for (var i = 0; i < event.frameBuffer.length; i += 1) {
      buffer [length_now + i] = event.frameBuffer[i];
}

私が見つけた唯一の解決策は、Float32Arrayを通常の配列にコピーすることですが、それは間違いなく私が望んでいることではありません。どうしますか、stackoverflowers?

4

3 に答える 3

24

型指定された配列は配列バッファーに基づいており、動的にサイズを変更することはできないため、配列の末尾を超えて書き込んだり、使用したりすることpush()はできません。

必要なことを実現する1つの方法はFloat32Array、両方の配列を含むのに十分な大きさの新しいを割り当て、最適化されたコピーを実行することです。

function Float32Concat(first, second)
{
    var firstLength = first.length,
        result = new Float32Array(firstLength + second.length);

    result.set(first);
    result.set(second, firstLength);

    return result;
}

それはあなたが書くことを可能にするでしょう:

buffer = Float32Concat(buffer, event.frameBuffer);
于 2010-12-29T13:18:21.230 に答える
3

または、N個の配列を結合しようとしている場合:

// one-liner to sum the values in an array
function sum(a){
  return a.reduce(function(a,b){return a+b;},0);
}

// call this with an array of Uint8Array objects
function bufjoin(bufs){
  var lens=bufs.map(function(a){return a.length;});
  var aout=new Uint8Array(sum(lens));
  for (var i=0;i<bufs.length;++i){
    var start=sum(lens.slice(0,i));
    aout.set(bufs[i],start); // copy bufs[i] to aout at start position
  }
  return aout;
}
于 2012-12-30T08:53:07.023 に答える
2

私は同じ問題を抱えていました、あなたはプロトタイプに以下を追加することができます

Float32Array.prototype.concat = function() {
    var bytesPerIndex = 4,
        buffers = Array.prototype.slice.call(arguments);

    // add self
    buffers.unshift(this);

    buffers = buffers.map(function (item) {
        if (item instanceof Float32Array) {
            return item.buffer;
        } else if (item instanceof ArrayBuffer) {
            if (item.byteLength / bytesPerIndex % 1 !== 0) {
                throw new Error('One of the ArrayBuffers is not from a Float32Array');  
            }
            return item;
        } else {
            throw new Error('You can only concat Float32Array, or ArrayBuffers');
        }
    });

    var concatenatedByteLength = buffers
        .map(function (a) {return a.byteLength;})
        .reduce(function (a,b) {return a + b;}, 0);

    var concatenatedArray = new Float32Array(concatenatedByteLength / bytesPerIndex);

    var offset = 0;
    buffers.forEach(function (buffer, index) {
        concatenatedArray.set(new Float32Array(buffer), offset);
        offset += buffer.byteLength / bytesPerIndex;
    });

    return concatenatedArray;
};

今、あなたは簡単に行うことができます

var array1 = new Float32Array(10000000),
    array2 = new Float32Array(10000000);

var array3 = array1.concat(array2);
于 2016-07-14T01:35:04.910 に答える