如何在 JavaScript/jQuery 中查找数组是不是包含特定字符串?
Posted
技术标签:
【中文标题】如何在 JavaScript/jQuery 中查找数组是不是包含特定字符串?【英文标题】:How to find if an array contains a specific string in JavaScript/jQuery?如何在 JavaScript/jQuery 中查找数组是否包含特定字符串? 【发布时间】:2011-09-01 06:27:05 【问题描述】:谁能告诉我如何检测"specialword"
是否出现在数组中?示例:
categories: [
"specialword"
"word1"
"word2"
]
【问题讨论】:
纯 JS 中:***.com/a/25765186/1320932 纯JS:categories.includes("specialword") @patz 注意纯 JS,IE(任何版本)不支持 link @foxontherock 开始使用转译器 - 不要担心任何事实检查,我可以使用这个属性之类的事情。 【参考方案1】:你真的不需要 jQuery。
var myarr = ["I", "like", "turtles"];
var arraycontainsturtles = (myarr.indexOf("turtles") > -1);
提示:indexOf返回一个数字,表示指定的searchvalue第一次出现的位置,如果从未出现则返回-1 发生
或
function arrayContains(needle, arrhaystack)
return (arrhaystack.indexOf(needle) > -1);
值得注意的是array.indexOf(..)
是not supported in IE < 9,但是jQuery 的indexOf(...)
函数即使对于那些旧版本也可以工作。
【讨论】:
James,正如我所指出的,该页面确实说它可以在 IE9 中运行。你让它适用于 IE developer.mozilla.org/en-US/docs/Web/javascript/Reference/… indexOf 在所有主流浏览器中都可用,除了 IE'foo' in arr
呢?
@SuperUberDuper: 检查对象键是否存在:1 in ['a'] -> false
1 in ['a', 'b'] -> true
'length' in [] -> true
在 JS 中,数组本质上是一个带有数字键的对象。
needsmorejquery.com【参考方案2】:
jQuery 提供$.inArray
:
注意 inArray 返回找到的元素的索引,所以0
表示该元素是数组中的第一个元素。 -1
表示未找到该元素。
var categoriesPresent = ['word', 'word', 'specialword', 'word'];
var categoriesNotPresent = ['word', 'word', 'word'];
var foundPresent = $.inArray('specialword', categoriesPresent) > -1;
var foundNotPresent = $.inArray('specialword', categoriesNotPresent) > -1;
console.log(foundPresent, foundNotPresent); // true false
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
3.5 年后编辑
$.inArray
在支持它的浏览器中实际上是Array.prototype.indexOf
的包装器(现在几乎所有浏览器),同时在那些不支持它的浏览器中提供一个填充程序。它本质上等同于在Array.prototype
中添加一个 shim,这是一种更惯用/JSish 的做事方式。 MDN 提供such code。这些天我会选择这个选项,而不是使用 jQuery 包装器。
var categoriesPresent = ['word', 'word', 'specialword', 'word'];
var categoriesNotPresent = ['word', 'word', 'word'];
var foundPresent = categoriesPresent.indexOf('specialword') > -1;
var foundNotPresent = categoriesNotPresent.indexOf('specialword') > -1;
console.log(foundPresent, foundNotPresent); // true false
3 年后再编辑
天哪,6.5 年?!
现代 Javascript 中最好的选择是 Array.prototype.includes
:
var found = categories.includes('specialword');
没有比较,也没有混淆 -1
结果。它做我们想做的事:它返回true
或false
。对于旧版浏览器,它是 polyfillable using the code at MDN。
var categoriesPresent = ['word', 'word', 'specialword', 'word'];
var categoriesNotPresent = ['word', 'word', 'word'];
var foundPresent = categoriesPresent.includes('specialword');
var foundNotPresent = categoriesNotPresent.includes('specialword');
console.log(foundPresent, foundNotPresent); // true false
【讨论】:
【参考方案3】:给你:
$.inArray('specialword', arr)
此函数返回一个正整数(给定值的数组索引),如果在数组中未找到给定值,则返回-1
。
现场演示: http://jsfiddle.net/simevidas/5Gdfc/
你可能想这样使用它:
if ( $.inArray('specialword', arr) > -1 )
// the value is in the array
【讨论】:
【参考方案4】:您可以使用for
循环:
var found = false;
for (var i = 0; i < categories.length && !found; i++)
if (categories[i] === "specialword")
found = true;
break;
【讨论】:
我可能完全错了,但你不想在 for 循环中声明 i 吗?如果你不把“var”放在前面,它会把它放在全局上下文中(我认为......),这可能不是你想要的。 虽然这是真的,但这并不是他在这里所说的重点。不要为了几棵树而忽视森林。 @ChrisJones 鉴于 JS 业余爱好者会将这个答案复制并粘贴到他们的代码中,它应该越好【参考方案5】:我不喜欢$.inArray(..)
,这是一种丑陋的、jQuery 风格的解决方案,大多数理智的人都不会容忍。这是一个 sn-p,它为您的武器库添加了一个简单的 contains(str)
方法:
$.fn.contains = function (target)
var result = null;
$(this).each(function (index, item)
if (item === target)
result = item;
);
return result ? result : false;
同样,您可以将$.inArray
包装在扩展中:
$.fn.contains = function (target)
return ($.inArray(target, this) > -1);
【讨论】:
(我不是反对者)我不确定在总结一个依赖于 $(selector).each() 的方法时我是否理解对 $.inArray 的嘲笑。实际的 inArray 代码只是将 indexOf 用于本机支持它的浏览器,或者在不支持时使用像 Jared 的答案这样的 for 循环。对我来说似乎非常优雅。【参考方案6】:我们可以使用includes选项(js内置函数),如果为true则返回true,如果找到值则为false。
如果你想要精确的索引,你可以使用 indexOf (这也是 js 内置函数),如果找到值,它将返回精确的索引,否则它将返回 -1。
您可以使用返回布尔值的 .some 方法切换 .includes。 一旦找到匹配项,它将立即退出,这对于大型数组的性能非常有用:
注意:都区分大小写
var myarr = ["I", "like", "turtles"];
isVal = myarr.includes('like')
index = myarr.indexOf('like')
some = myarr.some(item => item.toLowerCase() == 'like'.toLowerCase())
console.log(isVal)
console.log(index)
console.log(some)
请检查一下。
【讨论】:
虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。【参考方案7】:使用现代 javascript 的 Array 方法:
Array.prototype.includes() // 在 ES7 中引入:
返回布尔值const data =
categories: [
"specialword",
"word1",
"word2"
]
console.log("Array.prototype.includes()")
// Array.prototype.includes()
// returns boolean
console.log(data.categories.includes("specialword"))
console.log(data.categories.includes("non-exist"))
.as-console-wrapper max-height: 100% !important; top: 0;
Array.prototype.find() // 在 ES6 中引入:
返回找到的元素或未定义的元素const data =
categories: [
"specialword",
"word1",
"word2"
]
console.log("Array.prototype.find()")
// Array.prototype.find()
// returns the element if found
// returns undefined if not found
console.log(data.categories.find(el => el === "specialword") != undefined)
console.log(data.categories.find(el => el === "non-exist") != undefined)
.as-console-wrapper max-height: 100% !important; top: 0;
【讨论】:
以上是关于如何在 JavaScript/jQuery 中查找数组是不是包含特定字符串?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 javascript 查找 Chrome 警告消息框
序列化对象以在 JavaScript/jQuery 中查询字符串 [重复]