如何检查数组是否包含JavaScript中的对象?

找出JavaScript数组是否包含对象的最简洁高效的方法是什么?

这是我知道这样做的唯一途径:

function contains(a, obj) {
    for (var i = 0; i < a.length; i++) {
        if (a[i] === obj) {
            return true;
        }
    }
    return false;
}

有更好更简洁的方法来完成这个吗?

这与Stack Overflow问题密切相关在JavaScript数组中找到一个项目的最佳方法? 它使用indexOf来解决查找数组中的对象的问题。


当前的浏览器具有Array#includes ,它完全支持这一功能,并为旧版浏览器提供了polyfill。

您也可以使用Array#indexOf ,它不那么直接,但不需要Polyfills用于过时的浏览器。

jQuery提供了$.inArray ,它在功能上等同于Array#indexOf

underscore.js是一个JavaScript实用程序库,提供_.contains(list, value) ,别名_.include(list, value) ,如果传递JavaScript数组,它们都将在内部使用indexOf。

其他一些框架提供了类似的方法:

  • Dojo Toolkit: dojo.indexOf(array, value, [fromIndex, findLast])
  • 原型: array.indexOf(value)
  • MooTools: array.indexOf(value)
  • findValue(array, value)findValue(array, value)
  • MS Ajax: array.indexOf(value)
  • Ext: Ext.Array.contains(array, value)
  • Lodash: _.includes(array, value, [from]) (是_.contains在4.0.0之前)
  • ECMAScript 2016: array.includes(value)
  • 请注意,有些框架将其作为函数实现,而其他框架则将该函数添加到数组原型中。


    更新:由于@orip在评论中提到,链接的基准测试是在2008年完成的,所以结果可能与现代浏览器无关。 但是,无论如何,您可能需要这样才能支持非现代浏览器,并且此后可能还没有更新过。 总是为自己测试。

    正如其他人所说,通过数组迭代可能是最好的方法,但已经证明, while循环递减是在JavaScript中迭代的最快方式。 所以你可能想重写你的代码,如下所示:

    function contains(a, obj) {
        var i = a.length;
        while (i--) {
           if (a[i] === obj) {
               return true;
           }
        }
        return false;
    }
    

    当然,你也可以扩展Array原型:

    Array.prototype.contains = function(obj) {
        var i = this.length;
        while (i--) {
            if (this[i] === obj) {
                return true;
            }
        }
        return false;
    }
    

    现在你可以简单地使用以下内容:

    alert([1, 2, 3].contains(2)); // => true
    alert([1, 2, 3].contains('2')); // => false
    

    indexOf可能,但它是“对ECMA-262标准的JavaScript扩展;因此它可能不存在于标准的其他实现中。”

    例:

    [1, 2, 3].indexOf(1) => 0
    ["foo", "bar", "baz"].indexOf("bar") => 1
    [1, 2, 3].indexOf(4) => -1
    

    AFAICS微软不提供这种替代方法,但是如果你愿意的话,你可以在Internet Explorer(和其他不支持indexOf浏览器)中添加类似的功能,就像谷歌的一个快速搜索显示的那样(例如,这个一)。

    链接地址: http://www.djcxy.com/p/217.html

    上一篇: How do I check if an array includes an object in JavaScript?

    下一篇: In JavaScript, what is the difference between indexOf() and search()?