希望更快的双向indexOf
/ lastIndexOf
替代
2015年
尽管新方法包括的非常好,但目前支持基本上为零。
很长一段时间以来,我一直在考虑替换慢速indexOf / lastIndexOf函数的方法。
已经找到了一种表现最佳的方法,寻找最重要的答案。从这些中,我选择了contains
@Damir Zekic发布的功能,该功能应该是最快的。但是它也指出基准是从2008年开始的,因此已经过时了。
我也喜欢while
过for
,但不具体原因我结束了编写函数for循环。也可以用while --
。
我很好奇,如果在执行过程中检查数组的两侧,迭代是否会慢得多。显然没有,因此此功能比最受好评的功能快大约两倍。显然,它也比本地的要快。在现实环境中,您永远都不知道要搜索的值是在数组的开头还是结尾。
当您知道只是使用一个值推入一个数组时,使用lastIndexOf可能仍然是最好的解决方案,但是如果必须遍历大数组并且结果可能无处不在,那么这可能是使事情变得更快的可靠解决方案。
双向indexOf / lastIndexOf
function bidirectionalIndexOf(a, b, c, d, e){
for(c=a.length,d=c*1; c--; ){
if(a[c]==b) return c; //or this[c]===b
if(a[e=d-1-c]==b) return e; //or a[e=d-1-c]===b
}
return -1
}
//Usage
bidirectionalIndexOf(array,'value');
性能测试
http://jsperf.com/bidirectionalindexof
作为测试,我创建了一个包含100k条目的数组。
三个查询:数组的开头,中间和结尾。
我希望您也觉得这很有趣并测试性能。
注意:如您所见,我对contains
函数进行了一些修改,以反映indexOf和lastIndexOf的输出(因此基本上true
与index
和false
一起使用-1
)。那不应该伤害它。
数组原型变体
Object.defineProperty(Array.prototype,'bidirectionalIndexOf',{value:function(b,c,d,e){
for(c=this.length,d=c*1; c--; ){
if(this[c]==b) return c; //or this[c]===b
if(this[e=d-1-c] == b) return e; //or this[e=d-1-c]===b
}
return -1
},writable:false, enumerable:false});
// Usage
array.bidirectionalIndexOf('value');
还可以轻松修改该函数以返回true或false,甚至返回对象,字符串或其他内容。
这是while
变体:
function bidirectionalIndexOf(a, b, c, d){
c=a.length; d=c-1;
while(c--){
if(b===a[c]) return c;
if(b===a[d-c]) return d-c;
}
return c
}
// Usage
bidirectionalIndexOf(array,'value');
这怎么可能?
我认为,获取数组中反映索引的简单计算是如此简单,以至于它比实际循环迭代快两倍。
这是一个复杂的示例,每个迭代执行三个检查,但是这只有在较长的计算时才有可能,这会导致代码变慢。
http://jsperf.com/bidirectionalindexof/2