javascript中如何快速判断某个变量是否在一个数组里
天蓬老师
天蓬老师 2017-04-10 14:36:50
[JavaScript讨论组]

除了一个一个循环然后判断以外,是否有更加简单快捷的判断方式,不知道为啥js的array对象不内置这么常用的方法

天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(3)
伊谢尔伦

答案有三: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 因爲做了額外工作(從註釋看是爲了優化)反而降低了效率。

高洛峰

有啊。

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

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

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

黄舟

既然这么纠结为什么不使用 http://underscorejs.org/ 或者 http://sugarjs.com/

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号