找出JavaScript数组是否包含值的最简洁,最有效的方法是什么?
这是我知道的唯一方法:
function contains(a, obj) {
for (var i = 0; i < a.length; i++) {
if (a[i] === obj) {
return true;
}
}
return false;}有没有更好,更简洁的方法来实现这一目标?
现代的浏览器Array#includes,这不正是这一点,得到广泛支持的人,除IE:
console.log(['joe', 'jane', 'mary'].includes('jane')); //true您也可以使用Array#indexOf,它不太直接,但对于过时的浏览器不需要使用polyfill。
许多框架还提供类似的方法:
jQuery的: $.inArray(value, array, [fromIndex])
Underscore.js :(_.contains(array, value)也别名为_.include和_.includes)
MooTools: array.indexOf(value)
MochiKit: findValue(array, value)
MS Ajax: array.indexOf(value)
Lodash: _.includes(array, value, [from])(是_.contains现有4.0.0)
注意,有些框架将此功能实现为一个函数,而另一些框架则将该函数添加到数组原型中。
从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)); // => truealert([1, 2, 3].contains('2')); // => falseECMAScript 7引入了Array.prototype.includes。
可以这样使用:
[1, 2, 3].includes(2); // true[1, 2, 3].includes(4); // false
它还接受一个可选的第二个参数fromIndex:
[1, 2, 3].includes(3, 3); // false[1, 2, 3].includes(3, -1); // true
不像indexOf,它采用严格相等比较,includes比较了使用SameValueZero平等算法。这意味着您可以检测数组是否包含NaN:
[1, 2, NaN].includes(NaN); // true
也不同于indexOf,includes不会跳过缺少的索引:
new Array(5).includes(undefined); // true
目前,它仍然是草稿,但可以对其进行多填充以使其在所有浏览器上均可使用。