检查对象的键是否比在数组中搜索字符串更有效?
我正在创建一个数据结构,其中包含我将用来反复检查是否定义了某些值的数据结构。 我想出了两个可能的解决方案,我想知道哪个更有效,或者是否有更好的方法:
1)使用数组: keys = ['key1' , 'key2', 'key3']
我可以创建一个这样的数组,然后使用jQuery.inArray(keyToCheck, keys) > -1
检查并查看keyToCheck
是否在我的数组中。
2)使用对象: keys = {key1 : 1, key2 : 1, key3: 1}
我可以创建这个对象然后使用keys[keyToCheck] || 0
keys[keyToCheck] || 0
来查看是否定义了keyToCheck
。
我不确定的是如何在javascript中实现搜索对象,以及它是否比循环数组的jQuery.inArray
更有效。 这些方法之间是否存在性能差异? 使用jQuery对我来说不是问题,因为我已经在我的代码中出于其他原因。
当想知道表演时,获得答案的方法是在jsperf上测试几个案例。
(可能还有其他我不知道的基准网站,如果你知道另一个,请发表评论,我不是故意做广告)
对于您的情况,我测试了3种方法:
– 在数组中使用indexOf
– 使用’in’运算符
– 测试对象的属性值
psperf在这里大约有10个项目在这里: http ://jsperf.com/key-or-array-search/2
我们可以看到在Firefox上使用对象的属性值要快得多(> 20倍于arrays,> 5倍)。
在Safari上,一切都比在Firefox上慢,对象属性访问仍然快两倍以上。
但是在Chrome上我不明白发生了什么:所有3种方法都非常接近,但最快的是数组/ indexOf方法,……
表演通常令人惊讶。
请注意,结果可能会发生变化 – 甚至会发生显着变化 – 取决于键的数量(5,20,5000?),以及检查键在集合中的概率。
我想知道500长度的关键数组如何改变。 结果如下: http : //jsperf.com/key-or-array-search/3
我们看到arrays因“大”键数而被击败。
所以你必须弄清楚你所处的情况。
通过一点键计数,处理属性的开销使得数组获胜。
由于密钥数量很大,在数组中迭代的成本使得该属性获胜……