找出 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 。
其他一些框架提供了类似的方法:
dojo.indexOf(array, value, [fromIndex, findLast])
array.indexOf(value)
array.indexOf(value)
findValue(array, value)
: findValue(array, value)
array.indexOf(value)
Ext.Array.contains(array, value)
_.includes(array, value, [from])
(是_.contains
之前的 4.0.0) array.includes(value)
请注意,某些框架将此实现为函数,而其他框架则将该函数添加到数组原型中。
更新:正如 @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
的),如果你想, 快速谷歌搜索发现 (例如, 该一 )。