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()
肯定是正确的选择。我将尝试并检查它是否实际返回新数组。显然,遗憾的是,它确实需要返回数组的新副本:/