除了一个一个循环然后判断以外,是否有更加简单快捷的判断方式,不知道为啥js的array对象不内置这么常用的方法
答案有三:1. jQuery, $.inArray(x, arr)
; 2. 自製, in_array(x, arr)
; 3. arr.indexOf(x)
性能參見:http://jsperf.com/in-array-vs-inarray-vs-indexof/7
性能測試2: http://jsperf.com/in-array-vs-indexof
貼上代碼
$.inArray
:
inArray: function( elem, arr, i ) {
var len;
if ( arr ) {
if ( indexOf ) {
return indexOf.call( arr, elem, i );
}
len = arr.length;
i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
for ( ; i < len; i++ ) {
// Skip accessing in sparse arrays
if ( i in arr && arr[ i ] === elem ) {
return i;
}
}
}
return -1;
},
自製 in_array
:
function in_array(needle, haystack) {
var i = 0, n = haystack.length;
for (;i < n;++i)
if (haystack[i] === needle)
return true;
return false;
}
indexOf
:
(arr.indexOf(x) !== -1)
總結
經測試,論多瀏覽器多數據類型的綜合性能,傳統的循環效率最高(前提是像我一樣,優化好代碼)
除 chrome 39 x64 ,純數字類型外,indexOf 的效率都不是最好的。
some + 匿名函數的效率實在太低了,不認直視,故不再考慮。
jQuery 因爲做了額外工作(從註釋看是爲了優化)反而降低了效率。
既然这么纠结为什么不使用 http://underscorejs.org/ 或者 http://sugarjs.com/
有啊。
every
,find
,some
这几个都行。当然还有最基础的 forEach
(可点击这几个方法名称带你去文档)
every
和 some
的区别在于:前者遍历所有元素进行判断,如果都为 true
则最后返回 true
,一旦碰到第一个为 false
的,遍历终止并返回 false
。后者刚好反过来,如果都为 false
,则最后返回 false
,一旦碰到第一个为 true
的,遍历终止并返回 true
。
find
则可以返回第一个找到的对象本身,而不是 booleen 结果。相应的还有一个 findIndex
返回的是数组下标。不过这俩都是 ES6 才增加的内置函数,如果你现在要用那就得考虑转换编译器了,比如 ES6-transpiler 之类的。