这个问题在这里已有答案:
我需要确定数组中是否存在值 .
我使用以下功能:
Array.prototype.contains = function(obj) {
var i = this.length;
while (i--) {
if (this[i] == obj) {
return true;
}
}
return false;
}
上面的函数总是返回false .
数组值和函数调用如下:
arrValues = ["Sam","Great", "Sample", "High"]
alert(arrValues.contains("Sam"));
18 回答
如果您有权访问ECMA 5,则可以使用 some 方法 .
MDN SOME Method Link
如果您有权访问ECMA 6,则可以使用 includes 方法 .
MDN INCLUDES Method Link
tl;dr
Example
Longer Answer
我知道这个问题并没有引用一篇文章来概括这个辩论,但是这个链接破了,我无法编辑原始评论,因为时间太长了,所以我把它包括在内了here .
如果您希望使用
contains
方法扩展内置Array
对象,可能最好也是最负责任的方法是使用MDN中的此polyfill . (另请参阅有关原型继承的MDN文章的this部分,其中解释了"The only good reason for extending a built-in prototype is to backport the features of newer JavaScript engines; for example Array.forEach, etc.")Don't want strict equality, or want to choose?
提供的答案对我不起作用,但它给了我一个想法:
它并不完美,因为超出分组的相同项目可能最终匹配 . 比如我的例子
当我使用分别包含1和2的'g'和'h'字段调用此函数时,它仍然会找到它,因为来自连接的结果字符串是:1,1,2,2,3,3
由于我的情况值得怀疑,我会遇到这种情况,我正在使用它 . 我以为我会分享,其他人也不能让选择的答案工作 .
您可以使用_.indexOf method或者如果您不想在应用程序中包含整个Underscore.js库,您可以查看how they did it并提取必要的代码 .
另一种选择是以下列方式使用
Array.some
(if available):当且仅当数组中的元素与
obj
相同时,传递给Array.some
的匿名函数才会返回true
. 如果没有这样的元素,该函数将不会为数组的任何元素返回true
,因此Array.some
也将返回false
.对于
contains
函数,最简单的解决方案是一个如下所示的函数:理想情况下,您不会将其作为独立函数,而是帮助程序库的一部分:
现在,如果你碰巧是那些仍然需要支持IE <9并且因此不能依赖
indexOf
的那些不幸的人之一,你可以使用这个polyfill,我得到from the MDN:从ECMAScript6开始,可以使用Set:
哇,这个问题有很多很棒的答案 .
我没有看到一个采用
reduce
方法,所以我将其添加:Here's a fiddle of it in action .
这通常是indexOf()方法的用途 . 你会说:
我的小贡献:
jQuery有一个实用功能:
在
array
中返回value
的索引 . 如果array
不包含value
,则返回-1
.另见How do I check if an array includes an object in JavaScript?
使用array .map函数为数组中的每个值执行一个函数对我来说似乎最干净 .
参考:Array.prototype.map()
此方法适用于简单数组和对象数组,您需要查看对象数组中是否存在键/值 .
Array.prototype.includes()
在ES2016中,有Array.prototype.includes() .
示例
支持
根据kangax和MDN,支持以下平台:
Chrome 47
边缘14
Firefox 43
歌剧34
Safari 9
节点6
可以使用Babel(使用
babel-polyfill
)或core-js扩展支持 . MDN还提供了polyfill:因为跨浏览器兼容性和效率的所有问题,使用像lodash这样的库几乎总是更安全 .
效率是因为可以保证在任何给定时间,像下划线这样非常受欢迎的库将具有完成这样的实用功能的最有效方法 .
如果您担心通过包含整个库而添加到应用程序中的批量,请知道您可以单独包含功能:
NOTICE: 对于旧版本的lodash,这是
_.contains()
而不是_.includes()
.我更喜欢简单:
你可以像使用它一样这个:
CodePen validation/usage
鉴于IE的indexOf的实现(如eyelidlessness所述):