如何在 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 @foxont​​herock 开始使用转译器 - 不要担心任何事实检查,我可以使用这个属性之类的事情。 【参考方案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'] -&gt; false 1 in ['a', 'b'] -&gt; true 'length' in [] -&gt; 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
&lt;script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"&gt;&lt;/script&gt;

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 结果。它做我们想做的事:它返回truefalse。对于旧版浏览器,它是 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 中查询字符串 [重复]

javascript jQuery的实现前端模糊查找

JavaScript--JQuery选择器

如何在 javascript/jquery 中发出 ajax 请求

JavaScript / jQuery:如何在 Firefox 中获取选定的文本