2013-10-24 37 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