找出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')); // => false
ECMAScript 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
目前,它仍然是草稿,但可以对其进行多填充以使其在所有浏览器上均可使用。