Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何调整键入数组的大小?_Javascript - Fatal编程技术网

Javascript 如何调整键入数组的大小?

Javascript 如何调整键入数组的大小?,javascript,Javascript,因此,我有一个Float32Array,包含1亿个元素。其中一些元素有缺陷,我需要将它们从阵列中移除 我所做的就是在最后转移那些叛逃分子。我认为只要调整数组的大小,从而从数组中删除元素就很容易了。令人惊讶的是,我找不到这样做的方法 由于内存限制,我不想创建新数组并将数据复制到该数组 有什么方法可以让我达到我的目标吗?有没有办法在不复制内存的情况下从阵列中删除这些元素 谢谢。当您“删除”项目时,不要将它们放在数组的末尾,而是使用slice方法,因此它将动态调整大小(意味着arr.length将在过

因此,我有一个
Float32Array
,包含1亿个元素。其中一些元素有缺陷,我需要将它们从阵列中移除

我所做的就是在最后转移那些叛逃分子。我认为只要调整数组的大小,从而从数组中删除元素就很容易了。令人惊讶的是,我找不到这样做的方法

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

有什么方法可以让我达到我的目标吗?有没有办法在不复制内存的情况下从阵列中删除这些元素

谢谢。

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


子数组
方法返回一个基于同一底层数组缓冲区的新类型Darray,因此在内存中不会重复原始类型Darray的内容

const a=新的Uint8Array([10,20,30,40,50]);
控制台日志(a);
//UINT8阵列[10,20,30,40,50]
常数b=a.子阵(2,4);
控制台日志(b);
//UINT8阵列[30,40]
控制台日志(b.bytellength);
// 2
请注意,共享ArrayBuffer本身不会更改:

console.log(新的Uint8Array(b.buffer));
//UINT8阵列(5)[10,20,30,40,50]
log(a.buffer==b.buffer);
//真的
如果使用
切片
方法而不是上面的
子数组
方法,则会复制内存,因此缓冲区不相等


在我看来,JavaScript并不完全适合这种任务,但有一件事你可以考虑的是将有缺陷的元素交换到数组的末尾(正如你所说的,你已经完成了),然后将这些索引设置为空。我认为Javascript没有提供任何有效的方法来调整数组的大小或从数组中删除元素,而不创建新的副本。然而,我可能弄错了,所以我为什么要把它作为一个评论而不是答案。再想一想,你有没有想过使用像设置这样的链表?这将使删除变得简单得多,但会失去数组的一些方便的方法/属性。但是,在不重复的情况下删除元素的功能会容易得多,因为您可以说
previous.next=current.next
,这样可以有效地删除节点,然后通过垃圾收集将其清除。@Spenced这不是我的选项,我实际上使用的是three.js,我所说的数组是顶点数组,所以它必须是类型化数组。另外,我认为设置
null
对我也不起作用。
array.slice(…)
将返回原始数组的一个新副本,OP说他希望避免这种情况。basic(例如从空数组)
array.slice()
也会这样做(返回新数组)但是我用了好几次,它实际上在基本数组中进行了修改。因此,我猜如果你不使用返回值,就是原始数组接受返回值..嗯,有趣的观察。我从来没有研究过这个问题,但我正在阅读Mozilla开发页面,它说它返回了一个新的数组。但是,如果您的观察是正确的,那么
array.slice()
肯定是正确的选择。我将尝试并检查它是否实际返回新数组。显然,遗憾的是,它确实需要返回数组的新副本:/