私はArrayBuffer
オブジェクトを使用していますが、それらを複製したいと思います。これは実際のポインタとmemcpy
を使用するとかなり簡単ですが、JavaScriptでそれを行う簡単な方法を見つけることができませんでした。
現在、これがArrayBuffers
をコピーする方法です。
function copy(buffer)
{
var bytes = new Uint8Array(buffer);
var output = new ArrayBuffer(buffer.byteLength);
var outputBytes = new Uint8Array(output);
for (var i = 0; i < bytes.length; i++)
outputBytes[i] = bytes[i];
return output;
}
きれいな方法はありますか?
ArrayBuffer
はslice
(http://www.khronos.org/registry/typedarray/specs/latest/)をサポートするはずなので、試してみることができます。
_buffer.slice(0);
_
Chrome 18では機能しますが、Firefox 10または11では機能しません。Firefoxの場合は、手動でコピーする必要があります。 Chrome slice()
は手動コピーよりも優れているので、Firefoxでslice()
にモンキーパッチを適用できます。これは次のようになります。
_if (!ArrayBuffer.prototype.slice)
ArrayBuffer.prototype.slice = function (start, end) {
var that = new Uint8Array(this);
if (end == undefined) end = that.length;
var result = new ArrayBuffer(end - start);
var resultArray = new Uint8Array(result);
for (var i = 0; i < resultArray.length; i++)
resultArray[i] = that[i + start];
return result;
}
_
その後、あなたは呼び出すことができます、
_buffer.slice(0);
_
配列をChromeとFirefoxの両方にコピーします。
私は次の方法を好みます
function copy(src) {
var dst = new ArrayBuffer(src.byteLength);
new Uint8Array(dst).set(new Uint8Array(src));
return dst;
}
ソースデータビューを渡すだけでコピーが実行されるようです。
var a = new Uint8Array([2,3,4,5]);
var b = new Uint8Array(a);
a[0] = 6;
console.log(a); // [6, 3, 4, 5]
console.log(b); // [2, 3, 4, 5]
FF 33およびChrome 36。
うーん...それがスライスしたいUint8Array(論理的には、そうでなければならない)なら、これはうまくいくかもしれません。
if (!Uint8Array.prototype.slice && 'subarray' in Uint8Array.prototype)
Uint8Array.prototype.slice = Uint8Array.prototype.subarray;
チャックジの答えのより速くて少し複雑なバージョン。大きな型付き配列では、コピー操作を約8分の1にする必要があります。基本的に、できるだけ多くの8バイトのチャンクをコピーしてから、残りの0〜7バイトをコピーします。 ArrayBufferにスライスメソッドが実装されていないため、これはIEの現在のバージョンで特に役立ちます。
if (!ArrayBuffer.prototype.slice)
ArrayBuffer.prototype.slice = function (start, end) {
if (end == undefined) end = that.length;
var length = end - start;
var lengthDouble = Math.floor(length / Float64Array.BYTES_PER_ELEMENT);
// ArrayBuffer that will be returned
var result = new ArrayBuffer(length);
var that = new Float64Array(this, start, lengthDouble)
var resultArray = new Float64Array(result, 0, lengthDouble);
for (var i = 0; i < resultArray.length; i++)
resultArray[i] = that[i];
// copying over the remaining bytes
that = new Uint8Array(this, start + lengthDouble * Float64Array.BYTES_PER_ELEMENT)
resultArray = new Uint8Array(result, lengthDouble * Float64Array.BYTES_PER_ELEMENT);
for (var i = 0; i < resultArray.length; i++)
resultArray[i] = that[i];
return result;
}
場合によっては(webaudio Audiobuffersなど)、2つの配列への参照しかありません。
したがって、array1をfloat32Arrayとして、array2をfloat32Arrayとして、
要素ごとに要素をコピーする必要があります。
そのためには、さまざまな方法を使用できます。
var ib=z.inputBuffer.getChannelData(0);
var ob=z.outputBuffer.getChannelData(0);
この
ib.forEach((chd,i)=>ob[i]=chd);
またはこれはより良く、おそらく速い
ob.set(ib);
これは、Array.setが既存の配列に(別の配列からでも)複数のデータを入力するためです。