2013-10-24 46 views
4

使用JavaScript我想偏移類型化數組中的元素,以便如果原始數組的值爲0到99,則新數組將從10開始並轉到99,留下10個空元素新數據。 因此,如果原始數組可以被視爲10 x 10網格,我想將所有數據向上移動一行,然後在最下一行輸入新數據。在類型化數組中編輯值

我知道這可以使用循環來完成,但是這個方法對於我的項目來說太慢了,因爲我的項目有更大的數組(990 x 1920)。 我試過ArrayBuffers,並且無處可去。

以下測試方法(使用子數組)的問題是,儘管data1大小被指定爲100,但它在應用時似乎減少到子數組的大小。最後,我可以找到無法添加更多數據的方法。

function initialize() { 

    data = new Uint32Array(100); 
    data1 = new Uint32Array(100); 

    for (var i = 0; i < data.length; i++) { 
    data[i] = i; 
    } 
    data1 = data.subarray(10); 

    console.log(data1); 
} 

除了一個循環來抵消類型化數組中的數據並在最後添加數據之外,還有其他什麼方法。

好的,我在使用Set()找到了一個解決方案Typed Arrays in Gecko 2: Float32Array concatenation and expansion

回答

1

在JavaScript中,類型化數組是基於ArrayBuffer的固定長度數據結構,即無論如何都是預先分配的一塊內存。正因爲如此,類型化數組沒有可變長度的方法,比如push,pop等。 所以爲了抵消一個類型化數組,你只有兩個選項。

  • 預分配預先大量內存和移位「類型數組」,這是在一個存儲器塊

    var SIZE=100; 
    var SHIFT=10; 
    var buffer = new ArrayBuffer(100000); // preallocate a lot of memory 
    var data = new Uint32Array(buffer, 0, SIZE); 
    for (var i = 0; i < SIZE; i++) { 
        data[i] = i; 
    } 
    var data1 = new Uint32Array(buffer, Uint32Array.BYTES_PER_ELEMENT*SHIFT, SIZE) 
    data1[90]=100; //set the 101st (91st) element 
    console.log('data1', data1);//10,11,...98,99,100,0,0,0,0,0,0,0,0,0 
    
  • 複製舊數據的切片到一個新的一個實際的圖內存區域。

    var SIZE=100; 
    var SHIFT=10; 
    var data = new Uint32Array(SIZE); 
    for (var i = 0; i < SIZE; i++) { 
        data[i] = i; 
    } 
    var data1 = new Uint32Array(SIZE) 
    data1.set(data.subarray(SHIFT)); 
    data1[90]=100; //set the 101st (91st) element 
    console.log('data1', data1); //10,11,...98,99,100,0,0,0,0,0,0,0,0,0 
    

這是一個經典space-time tradeoff。 第一個選項需要更多的內存,但更少的CPU週期,第二個選項是相反的方式。

+0

謝謝你的信息。我使用的解決方案與您的第二個建議類似。我會檢查你的第一個建議,看看內存是否可以處理它。 – user984749