2 回答
TA贡献1802条经验 获得超10个赞
Array.prototype.includes
是一个O(n)
操作,这是不可取的 - 每次您想要检查一个值是否存在时,您都必须迭代大部分集合(可能是整个集合)。
Map、Set 或 object 更好,因为检查它们是否具有值是一种O(1)
操作。
树也是不可取的,因为查找必然会在树下进行许多操作,如果树很大并且您想要频繁查找,这可能是一个问题 - 所以O(1)
解决方案更好。
地图虽然有效,但可能不合适,因为您只想查看值是否存在 - 您不需要键值对,只需要值。Set 仅由值组成(并且Set.has
确实是O(1)
),因此这是这种情况的最佳选择。带有键的对象虽然也可以工作,但可能不是一个好主意,因为它可能会创建许多不必要的隐藏类- Set 更适合在运行时针对动态值。
因此,Set 方法看起来是最高效和最合适的选择。
您还可以考虑将计算移至服务器的可能性。100,000 个项目不一定太多,但在客户端看到的数量仍然惊人。
TA贡献1804条经验 获得超3个赞
非常规地,您还可以使用一个对象并将 100,000 个项目中的每一个设置为一个属性,因为在幕后,JavaScript Object 是使用哈希表实现的。
例如,
var numbers = {
"1": 1243213,
"2": 4314121,
"3": 3142123
...
}
然后,您可以通过检查 if 来非常快速地检查项目是否存在numbers["1"] === undefined。不仅如此,您还可以同时获得房产的价值。
然而,这种方法确实有一些缺点,比如遍历列表变得更加复杂(尽管仍然可能)。
添加回答
举报