JavaScript – 如何检查数组是否包含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,这不正是那个,得到广泛支持,并具有填充工具旧版本浏览器。

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

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

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

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

请注意,有些框架将其作为函数实现,而其他框架则将该函数添加到数组原型中。


更新:由于@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

添加评论

友情链接:蝴蝶教程