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

找出JavaScript数组是否包含值的最简洁,最有效的方法是什么?

这是我知道的唯一方法:

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

有没有更好、更简洁的方法来实现这一目标?

这与堆栈溢出问题密切相关 在 JavaScript 数组中查找项目的最佳方法? 它解决了使用 在数组中查找对象的问题。indexOf


答案 1

现代浏览器有Array#includes,它正是这样做的,并且除了IE之外,每个人都广泛支持

console.log(['joe', 'jane', 'mary'].includes('jane')); //true

您还可以使用Array#indexOf,它不太直接,但对于过时的浏览器不需要polyfill。

console.log(['joe', 'jane', 'mary'].indexOf('jane') >= 0); //true

许多框架也提供类似的方法:

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


答案 2

从2019年更新:这个答案来自2008年(11岁!),与现代JS的使用无关。承诺的性能改进是基于当时在浏览器中完成的基准测试。它可能与现代 JS 执行上下文无关。如果您需要一个简单的解决方案,请寻找其他答案。如果您需要最佳性能,请在相关执行环境中为自己进行基准测试。

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

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