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

Posted

技术标签:

【中文标题】JavaScript .includes() 方法的多个条件【英文标题】:multiple conditions for JavaScript .includes() method 【发布时间】:2016-10-20 04:07:56 【问题描述】:

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

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

想象一下逗号状态“或”。

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

有没有办法做到这一点?

【问题讨论】:

or 意味着至少一个匹配就足够了。 与其寻找包含方法的解决方案,不如尝试 indexOf 如下:['hello', 'hi', 'howdy'].indexOf(str) @SkanderJenhani 在评论之前至少阅读并尝试。您的建议将始终返回-1 && 可以做什么? 【参考方案1】:

使用includes(),不,但您可以通过test() 使用正则表达式实现相同的目的:

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

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

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

REGEX 方法是一个更好的主意,因为它允许您将单词匹配为实际单词,而不是 other 单词的子字符串。你只需要单词边界标记\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

【讨论】:

如果单词包含特殊的正则表达式字符,这将不起作用。此外,这不会满足 OP 的明显要求,它仅在与 single 单词匹配时才匹配。 嘿,Mitya,我写了这个受欢迎的答案,但我碰巧更喜欢你的解决方案。我已经尝试了很多次将结果限制为 只有一个 但不能弯曲正则表达式来做到这一点。 (hello|hi|howdy)1 不工作。有什么想法吗? 你到底是什么意思?如果您只想匹配一个,而不是多个,那么原始的includes() 肯定是您所需要的。 我似乎找不到用单个正则表达式匹配“唯一一个”目的词的方法。也许你可以第一次匹配,然后计算 num 结果是否 == 1。不确定 REGEX 不是用于规定找到(或不找到)多少列入白名单的选项池的工具。它处理序列,所以你可能会在这里遇到困难。【参考方案2】:

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

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 脚本中尝试此操作的人都会收到 TypeError:***.com/questions/51291776/… 使用 indexOf('string') !== -1 而不是包含来避免这个错误【参考方案3】:

您可以使用引用here 的.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 要求)也很有趣。这可以类似地计算与 .reduce 的交叉点并稍后检查它们是否等于 1。

【讨论】:

注意点:some() 是一种方法,而不是运算符。否则,很好的答案。 点了。谢谢 只是为了强调任何更分心的人,事实上,正如答案中正确加粗的那样,这对于数组中存在“至少一个元素”但不幸的是它没有回答 OP 的问题:“只有一个条件为真。” 你是对的。添加了额外的条件来演示如何减少数组以检查有多少匹配项【参考方案4】:

不是最好的答案,也不是最干净的,但我认为它更宽容。 就像您想对所有检查使用相同的过滤器一样。 实际上.filter() 使用数组并返回过滤后的数组(我也觉得更容易使用)。

var str1 = 'hi, how do you do?';
var str2 = 'regular string';
var conditions = ["hello", "hi", "howdy"];

// Solve the problem
var res1 = [str1].filter(data => data.includes(conditions[0]) || data.includes(conditions[1]) || data.includes(conditions[2]));
var res2 = [str2].filter(data => data.includes(conditions[0]) || data.includes(conditions[1]) || data.includes(conditions[2]));

console.log(res1); // ["hi, how do you do?"]
console.log(res2); // []


// More useful in this case
var text = [str1, str2, "hello world"];

// Apply some filters on data
var res3 = text.filter(data => data.includes(conditions[0]) && data.includes(conditions[2]));
// You may use again the same filters for a different check
var res4 = text.filter(data => data.includes(conditions[0]) || data.includes(conditions[1]));

console.log(res3); // []
console.log(res4); // ["hi, how do you do?", "hello world"]

【讨论】:

【参考方案5】:

这是一个controversial 选项:

String.prototype.includesOneOf = function(arrayOfStrings) 
  if(!Array.isArray(arrayOfStrings)) 
    throw new Error('includesOneOf only accepts an array')
  
  return arrayOfStrings.some(str => this.includes(str))

允许您执行以下操作:

'Hi, hope you like this option'.toLowerCase().includesOneOf(["hello", "hi", "howdy"]) // True

【讨论】:

【参考方案6】:

这可以通过使用 Array 和 RegEx 的 some/every 方法来完成。

检查列表(数组)中的 ALL 个单词是否存在于字符串中:

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

检查列表(数组)中的 ANY 个单词是否存在于字符串中:

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

【讨论】:

哇。这回答了我的两个问题。非常感谢!!!!【参考方案7】:

又一个!

let result

const givenStr = 'A, X' //values separated by comma or space.

const allowed  = ['A', 'B']
const given    = givenStr.split(/[\s,]+/).filter(v => v)

console.log('given (array):', given)

// given contains none or only allowed values:

result = given.reduce((acc, val) => 
  return acc && allowed.includes(val)
, true)

console.log('given contains none or only allowed values:', result)

// given contains at least one allowed value:

result = given.reduce((acc, val) => 
  return acc || allowed.includes(val)
, false)

console.log('given contains at least one allowed value:', result)

【讨论】:

【参考方案8】:

你也可以这样做:

const str = "hi, there"

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

console.log(res);

只要你的其中一个包含返回 true,value 就会为 true,否则,它将为 false。这与 ES6 完美配合。

【讨论】:

OP 说,“所以只有一个,并且只有一个条件为真。”您的 sn-p 将为包含所有三个单词的字符串返回 true,而 OP 希望它返回 false。 可以这样写:const res = str.includes("hello"|| "hi" || "howdy"); ?【参考方案9】:

扩展字符串原生原型:

if (!String.prototype.contains) 
    Object.defineProperty(String.prototype, 'contains', 
        value(patterns) 
            if (!Array.isArray(patterns)) 
                return false;
            

            let value = 0;
            for (let i = 0; i < patterns.length; i++) 
                const pattern = patterns[i];
                value = value + this.includes(pattern);
            
            return (value === 1);
        
    );

允许您执行以下操作:

console.log('Hi, hope you like this option'.toLowerCase().contains(["hello", "hi", "howdy"])); // True

【讨论】:

【参考方案10】:

['hello', 'hi', 'howdy'].includes(str)怎么样?

【讨论】:

不,它不起作用:['hello', 'hi', 'howdy'].includes('hello, how are you ?') 返回 false,而 OP 要求返回 true 的解决方案。【参考方案11】:

1 线解决方案:

String/Array.prototype.includes('hello' || 'hi' || 'howdy');

let words = 'cucumber, mercy, introduction, shot, howdy'
words.includes('hi' || 'howdy' || 'hello') // true
words.includes('hi' || 'hello') // false

【讨论】:

因为'hi' 不是undefinedfalse,您提供的代码示例是检查words 字符串是否包含hi,因此words.includes(...) 语句都返回false。 【参考方案12】:

const givenArray = ['Hi , how are you', 'how are you', 'howdy, how you doing']
const includeValues = ["hello", "hi", "howdy"]
const filteredStrArray = givenArray.filter(str => includeValues.some(value => str.toLowerCase().includes(value)))

console.log(filteredStrArray);

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。

以上是关于JavaScript .includes() 方法的多个条件的主要内容,如果未能解决你的问题,请参考以下文章

javascript array.includes在反应中不起作用

JavaScript数组是否存在及是否存在某个元素

JavaScript ES6 数组新方法 学习随笔

为啥 [NaN].includes(NaN) 在 JavaScript 中返回 true?

Vue、Vuex、JavaScript:includes() 无法按预期工作

为啥这个 JavaScript includes() 功能有意义?