javascript - 对象键与数组查找性能

标签 javascript

示例 1:

["member1", "member2",...,..., "member100000"]

示例 2:

{
    "member1": true, // (doesn't really need values, only keys :/)
    "member2": true,
    "...",
    "member100000": true
}

我像示例 1 一样,将成员存储在每个内容的数组中,但这样做我必须遍历数组中的 49999 个项目,才能找到成员 50000,所以我的想法很简单检查一个特定的键是否在 javascript 对象中定义是一个更好的方法,虽然我不需要存储一个值,但只检查键是否未定义?

我需要的是能够检查是否例如。 “member50000”作为一个值存在于我的数组中 - 或者作为一个键存在于我的对象中。

我做了一些基准测试,但我不确定我得出的结论是否正确,或者我在比较中是否做错了什么:http://jsperf.com/lolda123

根据上面的测试结果,是否可以得出这样的结论:在值为 bool 值 (true) 的对象中保存键/值对,然后执行 if(obj["member50000"]) 是性能最佳的选项?即使不存在具有给定键的属性?正如我所看到的,根据我的测试结果,检查 key 本身是否存在,在性能方面似乎要昂贵得多,但检查 key 是否存在,确实是我所需要的。

我不关心值,所以我在这里遗漏了什么,或者为什么更好的解决方案看起来像是通过键查找值的解决方案,而不是仅仅在内部查找键对象?

最佳答案

好吧,我也是这么想的,使用对象会更快,但事实证明我错了!

我在 NodeJS 6.3(V8 引擎)上使用与 jsPerf 相同的堆栈运行性能测试:

https://github.com/amoldavsky/js-array-indexof-vs-hashmap

结果是:

  • 在更大的数据集上查找速度更快
  • 创建对象数据结构(基本上是一个 HashMap)非常昂贵!比使用数组慢得多
  • 结合插入和查找时,array.indexOf 的速度要快很多

如果您认为我在任何测试中犯了错误,请随时提出来,我们可以重新测试。尽管到目前为止,array.indexOf 看起来要快得多。

关于javascript - 对象键与数组查找性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30399073/

相关文章:

javascript - javascript箭头函数奇怪的未定义错误

javascript - 从路由组件更新父级的状态

javascript - 为什么 onchange 函数不使用 Jquery 调用 DropDownList?

javascript - Knockout js - 可见绑定(bind)与否定不起作用

javascript - 抓取呈现的 JavaScript 网页

javascript - 缩放嵌入内容以适合窗口? Flash 或 HTML5 视频

javascript - 网站如何知道我的 Gmail 地址?

javascript - 将 JavaScript 附加到 body 标签

javascript - 关闭浏览器后保存变量

javascript - 是否可以在没有 PHP 的情况下创建上传文件脚本(并被服务器接受)