2012-12-28 5 views
21

複数の配列バッファをマージしてBlobを作成したいと思います。しかし、あなたが知っているように、 TypedArray dosen'tは、結果として "プッシュ" または有用な方法...TypedArraysをJavaScriptでマージするにはどうすればよいですか?

例えば:

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

を持って、私は[ 1, 2, 3, 4, 5, 6 ]を取得したいのですが。

+2

をチェックせずに

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

本来の機能を全く 'push'はありません。 – Prinzhorn

+0

オハイオ州、わかった。 TypedArrayは単なる配列ではありませんか?お返事ありがとうございました – yomotsu

答えて

39

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

私は理解することができた。私は新しい統合されたものを作成する必要があります。 – yomotsu

+4

@yomotsuはい新しいものを作成する必要があります。あなたがCを知っているなら、TypedArrayは 'malloc'を使うことに似ています(' free'する必要はありません)。しかし、reallocのようなものはありません。 – Prinzhorn

4

私はいつもこの機能を使用:1:彼らはネイティブメモリに1をマッピングするため、nullまたは種類

ため
function mergeTypedArraysUnsafe(a, b) { 
    var c = new a.constructor(a.length + b.length); 
    c.set(a); 
    c.set(b, a.length); 

    return c; 
} 
+0

「ヌル」チェックはなく、 '==='の代わりに '=='があります。これは基本的にはプリンシーンの答えの複製であり、関数で囲まれています。 – Cerbrus

+0

もう一度、私が使用したいと思うちょっとした機能は、他の誰かがそれを使うことができるかもしれないと思っていました。 –

+0

通常、回答のコードでエラーを修正することはありません。それは質問に答えた人物、それゆえのコメントまでです。 – Cerbrus