寻找一个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'在数组中寻找对象。
**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 prototype。
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
的浏览器)中为数组添加类似的功能,正如快速谷歌搜索发现的(例如,这个)。