开发者问题收集

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

2008-10-25
3618870

什么是最简洁有效的方法来找出 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 在数组中查找对象的问题。

3个回答

现代浏览器具有 Array#includes ,它 完全 实现了这一点,并且 受到 除 IE 之外的所有人广泛支持:

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

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

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

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

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

2009-09-24

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

正如其他人所说,通过数组进行迭代可能是最好的方法,但 已经证明 递减的 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
Damir Zekić
2008-10-25

最佳答案均假设原始类型,但如果您想要确定数组是否包含具有某些特征的 对象 Array.prototype.some() 是一种优雅的解决方案:

const items = [ {a: '1'}, {a: '2'}, {a: '3'} ]

items.some(item => item.a === '3')  // returns true
items.some(item => item.a === '4')  // returns false

它的优点在于,一旦找到元素,迭代就会中止,因此可以避免不必要的迭代循环。

此外,它非常适合 if 语句,因为它返回布尔值:

if (items.some(item => item.a === '3')) {
  // do something
}

* 正如 jamess 在评论中指出的那样,在回答此问题时,即 2018 年 9 月, Array.prototype.some() 已完全受支持: caniuse.com 支持表

Michael
2014-07-18