如何在 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
,它
完全
实现了这一点,并且
受到
除 IE 之外的所有人广泛支持:
console.log(['joe', 'jane', 'mary'].includes('jane')); // true
您还可以使用
Array#indexOf
,它不太直接,但不需要适用于过时浏览器的 polyfill。
console.log(['joe', 'jane', 'mary'].indexOf('jane') >= 0); // true
许多框架也提供类似的方法:
-
jQuery:
$.inArray(value, array, [fromIndex])
-
Underscore.js:
_.contains(array, value)
(也别名为_.include
和_.includes
) -
Dojo Toolkit:
dojo.indexOf(array, value, [fromIndex, findLast])
-
原型:
array.indexOf(value)
-
MooTools:
array.indexOf(value)
-
MochiKit:
findValue(array,值)
-
MS Ajax:
array.indexOf(value)
-
Ext:
Ext.Array.contains(array, value)
-
Lodash:
_.includes(array, value, [from])
(是_.contains
4.0.0 之前版本) -
Ramda:
R.includes(value, array)
请注意,一些框架将其实现为函数,而其他框架则将该函数添加到数组原型中。
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
最佳答案均假设原始类型,但如果您想要确定数组是否包含具有某些特征的 对象 , 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 支持表