我应该如何调整类型化数组的大小?

时间:2017-04-15 19:50:16

标签: javascript

所以,我有一个拥有1亿个元素的Float32Array。其中一些元素是缺陷的,我需要从数组中删除它们。

我所做的是在最后移动那些叛逃的元素。我认为只调整数组的大小并因此从数组中删除元素会很容易。令人惊讶的是,我找不到办法做到这一点。

由于内存限制,我不想创建新数组并将数据复制到该数组。

我有什么方法可以实现吗?有没有办法从阵列中删除那些没有内存重复的元素?

感谢。

2 个答案:

答案 0 :(得分:1)

当您“删除”项目时,不要将它们放在数组的末尾,而是使用slice方法,因此它将动态调整大小(意味着{I}将在此过程中更新)

http://devdocs.io/javascript/global_objects/float32array http://devdocs.io/javascript/global_objects/typedarray/slice

编辑:

Thx to @Dzmtrs:您可以使用arr.length代替splice()

答案 1 :(得分:0)

subarray方法基于相同的基础ArrayBuffer返回一个新的TypedArray,因此在内存中不会重复原始TypedArray的内容。

const a = new Uint8Array([10, 20, 30, 40, 50]);

console.log(a);
// Uint8Array [10, 20, 30, 40, 50]

const b = a.subarray(2, 4);

console.log(b);
// Uint8Array [30, 40]

console.log(b.byteLength);
// 2

请注意,共享的ArrayBuffer本身不会更改:

console.log(new Uint8Array(b.buffer));    
// Uint8Array(5) [ 10, 20, 30, 40, 50 ]

console.log(a.buffer === b.buffer);
// true

如果使用slice方法而不是上面的subarray方法,则将复制内存,因此缓冲区将不相等。

MDN