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

时间:2016-06-28 21:09:01

标签: javascript arrays node.js ecmascript-6 javascript-objects

所以为了简单起见,我需要移除/替换一堆(10000+)对象,我们可以假设该对象包含一个(String)Unique'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[...]是最好的选择,但我对其他人的反馈很感兴趣。我应该使用哪种,为什么?

1 个答案:

答案 0 :(得分:0)

这三种方法有所不同。

Array.splice删除一个对象,并在此1之后推送每个元素,因此索引不会被删除。

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

将变量设置为undefined几乎标记要删除垃圾收集器的对象。只有当JavaScript感觉如此时,它才会立即发生。如果你将足够的变量设置为undefined,那么这个方法几乎可以实现与删除对象相同的功能。

将变量设置为undefined与删除它不同,如果使用delete,则可能会遇到错误,当您尝试再次访问该变量时,将其设置为undefined时不会发生这种情况。