JavaScript .includes() 方法的多个条件

IT技术 javascript methods
2021-02-19 10:48:26

只是想知道,有没有办法向 .includes 方法添加多个条件,例如:

    var value = str.includes("hello", "hi", "howdy");

想象一下逗号表示“或”。

它现在询问字符串是否包含 hello、hihowdy。所以只有当一个,并且只有一个条件为真。

有没有办法做到这一点?

6个回答

您可以使用此处.some引用方法

some()方法测试数组中是否至少有一个元素通过了提供的函数实现的测试

// test cases
const str1 = 'hi hello, how do you do?';
const str2 = 'regular string';
const str3 = 'hello there';

// do the test strings contain these terms?
const conditions = ["hello", "hi", "howdy"];

// run the tests against every element in the array
const test1 = conditions.some(el => str1.includes(el));
const test2 = conditions.some(el => str2.includes(el));
// strictly check that contains 1 and only one match
const test3 = conditions.reduce((a,c) => a + str3.includes(c), 0) == 1;

// display results
console.log(`Loose matching, 2 matches "${str1}" => ${test1}`);
console.log(`Loose matching, 0 matches "${str2}" => ${test2}`);
console.log(`Exact matching, 1 matches "${str3}" => ${test3}`);

此外,正如用户在下面提到的,匹配上面提到的“恰好一个”外观(并且由 OP 要求)也很有趣。这可以通过类似地计算与 1 的交点.reduce并稍后检查它们是否等于 1 来完成。

只是为了让任何更心烦意乱的人强调这一事实,正如答案中正确加粗的那样,这对于“至少一个元素”在数组中时很有用,但不幸的是它没有回答 OP 的问题:'只有一个条件为真。
2021-04-20 10:48:26
注意点:some()是一个方法,而不是一个操作符。否则,很好的答案。
2021-04-21 10:48:26
你说的对。添加了额外的条件来演示如何减少数组以检查匹配的数量
2021-05-11 10:48:26
取点。谢谢
2021-05-13 10:48:26

使用includes(),不,但您可以通过test()以下方式使用 REGEX 实现相同的功能

var value = /hello|hi|howdy/.test(str);

或者,如果这些词来自动态来源:

var words = ['hello', 'hi', 'howdy'];
var value = new RegExp(words.join('|')).test(str);

REGEX 方法是一个更好的主意,因为它允许您将单词匹配为实际单词,而不是其他单词的子串你只需要词边界标记\b,所以:

var str = 'hilly';
var value = str.includes('hi'); //true, even though the word 'hi' isn't found
var value = /\bhi\b/.test(str); //false - 'hi' appears but not as its own word
嘿,Mitya,我写了这个受欢迎的答案,但我碰巧更喜欢你的解决方案。我已经多次尝试将结果限制为 只有一个,但不能弯曲正则表达式来做到这一点。(hello|hi|howdy){1}不管用。任何的想法?
2021-04-17 10:48:26
你是什​​么意思?如果您只想匹配一个,而不是多个,那么您肯定includes()需要原始的
2021-05-06 10:48:26
REGEX 不是用于规定找到(或未找到)有多少个列入白名单的选项池的工具。它处理序列,所以你可能会在这里挣扎。
2021-05-08 10:48:26
如果单词包含特殊的正则表达式字符,这将不起作用。此外,这不会满足 OP 的明显要求,它仅在与单个单词匹配时才匹配
2021-05-15 10:48:26
我似乎无法找到一种方法来将“一个且只有一个”的目的词与单个正则表达式相匹配。也许你可以第一次匹配,然后计算 num 结果是否 == 1。不确定
2021-05-15 10:48:26

即使只有一个条件为真,这也应该有效:

var str = "bonjour le monde vive le javascript";
var arr = ['bonjour','europe', 'c++'];

function contains(target, pattern){
    var value = 0;
    pattern.forEach(function(word){
      value = value + target.includes(word);
    });
    return (value === 1)
}

console.log(contains(str, arr));
只是一个注释。任何在 Google Apps Script 中尝试此操作的人都会收到 TypeError:stackoverflow.com/questions/51291776/...
2021-05-01 10:48:26
使用 indexOf('string') !== -1 而不是包含来避免这个错误
2021-05-02 10:48:26

你也可以做这样的事情:

const str = "hi, there"

const res = str.includes("hello") || str.includes("hi") || str.includes('howdy');

console.log(res);

每当您的一个包含返回 true 时,value 将为 true,否则,它将为 false。这与 ES6 完美配合。

OP 说,“所以只有当一个,并且只有一个条件为真。” 对于包含所有三个单词的字符串,您的代码段将返回 true,而 OP 希望它返回 false。
2021-04-18 10:48:26
可以这样写:const res = str.includes("hello"|| "hi" || "howdy");?
2021-04-22 10:48:26

这可以通过使用Array 和 RegEx 的一些/所有方法来完成

要检查字符串中是否存在 list(array) 中的所有单词:

const multiSearchAnd = (text, searchWords) => (
  searchWords.every((el) => {
    return text.match(new RegExp(el,"i"))
  })
)

multiSearchAnd("Chelsey Dietrich Engineer 2018-12-11 Hire", ["cle", "hire"]) //returns false
multiSearchAnd("Chelsey Dietrich Engineer 2018-12-11 Hire", ["che", "hire"]) //returns true

要检查字符串中是否存在 list(array) 中的任何单词:

const multiSearchOr = (text, searchWords) => (
  searchWords.some((el) => {
    return text.match(new RegExp(el,"i"))
  })
)

multiSearchOr("Chelsey Dietrich Engineer 2018-12-11 Hire", ["che", "hire"]) //returns true
multiSearchOr("Chelsey Dietrich Engineer 2018-12-11 Hire", ["aaa", "hire"]) //returns true
multiSearchOr("Chelsey Dietrich Engineer 2018-12-11 Hire", ["che", "zzzz"]) //returns true
multiSearchOr("Chelsey Dietrich Engineer 2018-12-11 Hire", ["aaa", "1111"]) //returns false
哇。这回答了我的两个问题。非常感谢!!!!
2021-05-13 10:48:26