我有一种情况,我可以选择将字符串键的集合实现为对象:
$.each(objects, function (key, object) {
collection[key] = "doesn't matter";
});
或数组:
$.each(objects, function (key, object) {
collection.push(key);
});
我希望能够快速确定该集合是否包含给定密钥。如果集合是一个对象,我可以使用:
if (collection.hasOwnProperty(key_to_find)) { // found it!... }
else { // didn't find it... }
如果collection是一个数组,我可以使用:
if ($.inArray(key_to_find, collection)) { // found it!... }
else { // didn't find it... }
我想使用JavaScript的内置hasOwnProperty会比jQuery的inArray()快,但我不完全确定。有没有人更多地了解这两种方法之间的性能差异?或者,这里有一个我不了解的更有效的替代方案吗?
答案 0 :(得分:6)
答案 1 :(得分:1)
嗯,如果集合是一个数组,你也可以使用原生indexOf,不是吗? https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf
答案 2 :(得分:1)
数组方法较慢,因为它需要线性时间来查找数组中的元素(代码必须逐步浏览每个元素)。 hasOwnProperty会更快,因为它可以使用哈希表查找,这是在恒定时间内发生的。
答案 3 :(得分:0)
对象将具有非常快的属性访问时间。但是,您仍然需要考虑计算哈希等的开销(如果实现使用哈希表来支持对象)。如果键组相对较小,则不应有太大差异。如果它更大,那么我会使用object / hash来存储属性。
也就是说,用对象管理重复键会更容易一些,所以我个人会选择字典。
除非这是您申请中的瓶颈,否则您不应该过度思考。
答案 4 :(得分:0)
简答:.indexOf()(如@Claudio提及)
答案很长:看看我编写的快速测试 - http://jsfiddle.net/cvallance/4YdxJ/3/ - 差异实际上可以忽略不计。