如何检查字符串是否包含JavaScript中子串数组中的文本?

Per*_*ddy 121 javascript arrays string substring contains

挺直的.在javascript中,我需要检查一个字符串是否包含数组中保存的任何子字符串.

T.J*_*der 176

没有任何内置功能可以为你做到,你必须为它编写一个函数.

如果您知道字符串不包含正则表达式中特殊的任何字符,那么您可以作弊,如下所示:

if (new RegExp(substrings.join("|")).test(string)) {
    // At least one match
}
Run Code Online (Sandbox Code Playgroud)

...创建一个正则表达式,它是您正在寻找的子串的一系列替换(例如one|two),并测试是否有任何匹配,但是如果任何子串包含任何特殊的字符在正则表达式(*,[等等),你必须先逃避他们,你最好只是在做无聊的循环来代替.

无偿的现场例子


更新:

在对该问题的评论中,Martin询问Array#mapECMAScript5中的新功能.map并没有那么多帮助,但是some:

if (substrings.some(function(v) { return str.indexOf(v) >= 0; })) {
    // There's at least one
}
Run Code Online (Sandbox Code Playgroud)

实例(仅适用于现代浏览器)

请注意,它确实意味着一些开销,并且您只在符合ECMAScript5的实现上拥有它(例如,不是IE7或更早版本;甚至可能不是IE8),但是如果你真的喜欢这种编程风格的话. (你可以使用ECMAScript5垫片,这个或其他几个垫片.)

  • +1 ECMAScript5 - 终于JavaScript走出意大利面角落...... (4认同)
  • *"请注意,它确实意味着一些开销..."*[但无需关心](http://blog.niftysnippets.org/2012/02/foreach-and-runtime-cost.html). (2认同)

rav*_*ren 52

var yourstring = 'tasty food'; // the string to check against


var substrings = ['foo','bar'],
    length = substrings.length;
while(length--) {
   if (yourstring.indexOf(substrings[length])!=-1) {
       // one of the substrings is in yourstring
   }
}
Run Code Online (Sandbox Code Playgroud)


Pra*_*ena 29

一线解决方案

substringsArray.some(substring=>yourBigString.includes(substring))
Run Code Online (Sandbox Code Playgroud)

返回true\falsesubstringexists\does'nt exist

需要ES6支持

  • 你的孩子...当我小时候我们不得不使用这些称为'for'循环的东西,你必须使用多行并知道你的阵列是1还是零基础,是的...你有一半的时间它错了,不得不调试并寻找一个叫做"我"的小虫子. (7认同)
  • @aamarks 黄金时代... (3认同)
  • 我喜欢简短的答案。 (2认同)

Jim*_*ler 20

function containsAny(str, substrings) {
    for (var i = 0; i != substrings.length; i++) {
       var substring = substrings[i];
       if (str.indexOf(substring) != - 1) {
         return substring;
       }
    }
    return null; 
}

var result = containsAny("defg", ["ab", "cd", "ef"]);
console.log("String was found in substring " + result);
Run Code Online (Sandbox Code Playgroud)

  • 最容易理解的! (2认同)

hal*_*ube 18

对于人们谷歌搜索,

应该是可靠的答案.

const substrings = ['connect', 'ready'];
const str = 'disconnect';
if (substrings.some(v => str === v)) {
   // Will only return when the `str` is included in the `substrings`
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这是一个略有不同的问题的答案,它会询问字符串**是否包含来自子字符串数组的**文本.此代码检查字符串**是否是其中一个子字符串.取决于我认为"包含"的含义. (8认同)
  • 或更短:if(substrings.some(v => v === str)){ (2认同)

kp1*_*123 8

这是(IMO)迄今为止最好的解决方案。这是一个现代 (ES6) 解决方案:

  • 高效(一行!)
  • 避免循环
  • some()其他答案中使用的函数不同,这个函数不只是返回一个布尔值(真/假)
  • 相反,它要么返回子字符串(如果它在数组中找到),要么返回 undefined
  • 更进一步,允许您选择是否需要部分子字符串匹配(下面的示例)

享受!



const arrayOfStrings = ['abc', 'def', 'xyz'];
const str = 'abc';
const found = arrayOfStrings.find(v => (str === v));
Run Code Online (Sandbox Code Playgroud)

在这里,found在这种情况下将设置为“abc”。这将适用于精确的字符串匹配。

如果你使用:

const found = arrayOfStrings.find(v => str.includes(v));
Run Code Online (Sandbox Code Playgroud)

found在这种情况下,将再次设置为“abc”。这不允许部分匹配,因此如果 str 设置为 'ab',found将是未定义的。


而且,如果您希望部分匹配起作用,只需将其翻转即可:
const found = arrayOfStrings.find(v => v.includes(str));
Run Code Online (Sandbox Code Playgroud)

反而。因此,如果 str 设置为 'ab',found则将设置为 'abc'。

十分简单!




use*_*ser 7

var str = "texttexttext";
var arr = ["asd", "ghj", "xtte"];
for (var i = 0, len = arr.length; i < len; ++i) {
    if (str.indexOf(arr[i]) != -1) {
        // str contains arr[i]
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:如果测试的顺序无关紧要,你可以使用它(只有一个循环变量):

var str = "texttexttext";
var arr = ["asd", "ghj", "xtte"];
for (var i = arr.length - 1; i >= 0; --i) {
    if (str.indexOf(arr[i]) != -1) {
        // str contains arr[i]
    }
}
Run Code Online (Sandbox Code Playgroud)


jas*_*ard 5

const str = 'Does this string have one or more strings from the array below?';
const arr = ['one', 'two', 'three'];

const contains = arr.some(element => {
  if (str.includes(element)) {
    return true;
  }
  return false;
});

console.log(contains); // true
Run Code Online (Sandbox Code Playgroud)