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

除了循环之外,还有什么方法可以偏移类型数组中的数据并在最后添加数据。

好的,我在 Gecko 2 的 Typed Arrays 中找到了一个解决方案:Float32Array concatenation and expansion using Set()。

4

1 回答 1

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
    

这是一个经典的时空权衡。第一个选项占用更多内存但 CPU 周期更少,第二个选项则相反。

于 2013-10-29T00:24:32.140 回答