数组中.splice (+ loops) vs Delete Object[..]vs Object[…]=未定义

Array.splice (+ loops) vs Delete Object[...] vs Object[...] = undefined

本文关键字:Object vs 未定义 splice loops 数组 Delete      更新时间:2023-09-26

因此,为了简单起见,我需要删除/替换一堆(10000+)对象,我们可以假设该对象包含一个(String)唯一的'id'。这些项通常需要重命名(更改id),但不像查找

那么频繁。
{ id: 'one' }, { id: 'two' }, ...

如果我把它们放在一个"关联数组"中(坏习惯),我可以快速访问它们,但需要循环(慢)来删除(注意:这实际上不起作用,因为findIndex只在适当的数组上正确工作,但for循环会做同样的事情)

arr = [];
arr['one'] = { id: 'one' };
arr['two'] = { id: 'two' };
arr.splice(arr.findIndex(function(i) { return i.id === 'one'; }), 1);

如果我将它们放在一个正常的数组中,我必须循环(慢)通过ID找到项目,删除也需要循环(慢)(编辑:在我的特殊情况下,删除它应该相对较快,因为我已经查找了它并有一个引用,但如果我失去引用,显然更慢)

arr = [{ id: 'one', }, { id: 'two' }];
arr.splice(arr.findIndex(function(i) { return i.id === 'one'; }), 1);

或者,如果我以明显正确的方式存储它们,我可以选择使用delete关键字(我一直被告知是缓慢的,破坏优化),或者设置为未定义(这让我有很多存在的元素-内存泄漏?和较慢的循环)

 obj = { one: { id: one }, two: { id: two } };
 delete obj['one'];

 obj = { one: { id: one }, two: { id: two } };
 obj['one'] = undefined;

我认为delete object[...]是最好的选择,但我对其他人的反馈很感兴趣。我应该使用哪一种,为什么?

这三种方法有不同之处。

数组。Splice删除一个对象,并将这个1之后的所有元素推回去,这样索引就不会被切断。

Delete尝试删除对象,但可能失败。这不会释放内存,只会破坏引用。垃圾收集器可以稍后释放相应的内存。

将变量设置为undefined几乎等于将该对象标记为要被垃圾收集器删除。它不会立即发生,只会在JavaScript感觉这样的时候发生。如果您将足够多的变量设置为undefined,那么该方法几乎可以实现与删除对象相同的功能。

将变量设置为undefined与删除它是不一样的,如果你使用delete,你可能会遇到错误,当你试图再次访问该变量时,当你将其设置为undefined时不会发生这种情况