如何检查数组是否包含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
,它完全支持这一功能,并为旧版浏览器提供了polyfill。
您也可以使用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
浏览器)中添加类似的功能,就像谷歌的一个快速搜索显示的那样(例如,这个一)。
上一篇: How do I check if an array includes an object in JavaScript?
下一篇: In JavaScript, what is the difference between indexOf() and search()?