协慌网

登录 贡献 社区

如何检查数组是否包含 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

> ['joe', 'jane', 'mary'].includes('jane');
true

您也可以使用不那么直接的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

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的),如果你想, 快速谷歌搜索发现 (例如, 该一 )。