2015-05-22 55 views
4

实施例1:对象键VS阵列查找性能

["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

根据上述检测结果,将那么可以得出结论:在值为布尔(真)的对象内保存键/值对,并且if(obj["member50000"])是最佳选择?即使没有给定密钥的财产甚至存在?正如我所看到的,根据我的测试结果,检查密钥本身的存在,在性能方面看起来会更加昂贵,但检查密钥是否存在,确实是我所需要的。

我不在乎价值,所以我在这里错过了一些东西,或者为什么更好的解决方案看起来像是通过关键点查找价值的那个,而不是只查找关键点,对象内部?

+1

你的测试用例似乎缺少'arr.indexOf(key)'。它会返回-1,如果它没有找到它。我对结果感兴趣。 – Katana314

+0

我试图进行基准测试的另一种方法是“新”(ES6)'Set'类型。 – Amit

+0

除了别人的建议,如果你愿意使用jQuery,你也可以测试:'$。inArray(key,arr);' – talemyn

回答

0

obj.hasOwnPropertyarr.indexOfhttp://jsperf.com/array-hasownproperty-vs-array-indexof

使用arr.indexOf也应该比任何循环,你做得更快快得多。

+0

你为什么认为'indexOf'会比循环更快?因为'indexOf'会以本地代码写入,因此可以使用 – Bergi

+0

。 – erikvold

+1

...这不一定比优化编译的JavaScript更快,正如许多案例所显示的那样。 – Bergi

1

嗯,我认为同样的事情,使用一个对象会更快,我证明自己错了!

我使用相同的堆栈jsPerf上的NodeJS 6.3(V8发动机)运行性能测试:

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

的结果是:

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

更快,如果你认为我做任何我的测试是错误随意把它我们可以重新测试。尽管到目前为止,看起来像array.indexOf要快得多。