【发布时间】:2016-10-31 09:04:20
【问题描述】:
因此,为了简单起见,我需要删除/替换一堆(10000 多个)对象,我们可以假设该对象包含一个(字符串)唯一“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[...] 是最好的选择,但我对其他人的反馈很感兴趣。我应该使用哪个,为什么?
【问题讨论】:
-
delete 也会释放一些内存。
-
不能使用
array.indexOf({ id: 'one' }...只能匹配同一个对象引用。与{ id: 'one' }=={ id: 'one' }相同为假 -
array为对象时请改名。 -
见this answer。并不是说delete很慢,而是对象的整个结构随着内存分配而改变。这就是影响性能的原因。这不是你能解决的问题。
-
@Joshua Davison 删除属性的速度很慢,并且稍后会导致幕后速度变慢。您可能希望使用
Map对象,它为您提供整个API 来设置、删除、清除所有键等。在普通对象中,最好将所需的对象属性设置为undefined:)
标签: javascript arrays node.js ecmascript-6 javascript-objects