2012-12-28 18 views
21

Chciałbym scalić wielu arachibrów, aby utworzyć obiekt typu blob. Jednak, jak wiadomo, TypedArray nie robi mieć "push" lub użyteczne metody ...Jak mogę połączyć TypedArrays w JavaScript?

np .:

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

W rezultacie, chciałbym dostać [ 1, 2, 3, 4, 5, 6 ].

+2

Nie ma 'push' ponieważ map do rodzimej pamięci 1: 1. – Prinzhorn

+0

ohhh, zrozumiałem. TypedArray to nie tylko tablica? Dziękuję za komentarze – yomotsu

Odpowiedz

39

Użyj metody set. Ale pamiętaj, że potrzebujesz teraz dwa razy więcej pamięci!

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

dziękuję za odpowiedź. mógłbym zrozumieć. Muszę utworzyć nowy scalony jeden. I. – yomotsu

+4

@yomotsu Tak, musisz utworzyć nowy. Jeśli znasz C, TypedArray jest podobny do używania 'malloc' (bez potrzeby" free "). Ale nie ma to jak "realloc". – Prinzhorn

4

zawsze skorzystać z tej funkcji:

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

pierwotnej funkcji bez sprawdzania null lub typów

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

    return c; 
} 
+0

Bez kontroli "zerowej", '==' zamiast '===', a to jest w zasadzie duplikat odpowiedzi Prinzhorna, zawinięty w funkcję. – Cerbrus

+0

Znowu, po prostu funkcja, z której lubię korzystać, pomyślałem, że może ktoś inny również z niej skorzystał - uwolnił się od poprawiania wszelkich błędów, które możesz znaleźć. –

+0

Zazwyczaj nie koryguje się błędów w kodzie odpowiedzi. To zależy od osoby, która odpowiedziała na pytanie, stąd komentarz. – Cerbrus