首页 > javascript中如何快速判断某个变量是否在一个数组里

javascript中如何快速判断某个变量是否在一个数组里

除了一个一个循环然后判断以外,是否有更加简单快捷的判断方式,不知道为啥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/


有啊。

everyfindsome 这几个都行。当然还有最基础的 forEach(可点击这几个方法名称带你去文档)

everysome 的区别在于:前者遍历所有元素进行判断,如果都为 true 则最后返回 true,一旦碰到第一个为 false 的,遍历终止并返回 false。后者刚好反过来,如果都为 false,则最后返回 false,一旦碰到第一个为 true 的,遍历终止并返回 true

find 则可以返回第一个找到的对象本身,而不是 booleen 结果。相应的还有一个 findIndex 返回的是数组下标。不过这俩都是 ES6 才增加的内置函数,如果你现在要用那就得考虑转换编译器了,比如 ES6-transpiler 之类的。

【热门文章】
【热门文章】