Просто интересно, есть ли способ добавить несколько условий в метод .includes, например:
var value = str.includes("hello", "hi", "howdy");
Представьте себе запятую, обозначающую «или».
Теперь он спрашивает, содержит ли строка привет, привет или привет. Так что только если выполняется одно и только одно из условий.
Есть ли способ сделать это?
javascript
methods
user6234002
источник
источник
or
означало бы, что по крайней мере одного совпадения будет достаточно.['hello', 'hi', 'howdy'].indexOf(str)
Ответы:
Это должно сработать, даже если выполняется одно и только одно из условий:
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));
источник
Вы можете использовать
.some
метод, указанный здесь .// test cases var str1 = 'hi, how do you do?'; var str2 = 'regular string'; // do the test strings contain these terms? var conditions = ["hello", "hi", "howdy"]; // run the tests against every element in the array var test1 = conditions.some(el => str1.includes(el)); var test2 = conditions.some(el => str2.includes(el)); // display results console.log(str1, ' ===> ', test1); console.log(str2, ' ===> ', test2);
источник
some()
это метод, а не оператор. В противном случае хороший ответ.С
includes()
, нет, но вы можете добиться того же с REGEX с помощьюtest()
:var value = /hello|hi|howdy/.test(str);
Или, если слова исходят из динамического источника:
var words = array('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
источник
Вы также можете сделать что-то вроде этого:
const str = "hi, there" const res = str.includes("hello") || str.includes("hi") || str.includes('howdy'); console.log(res);
Всякий раз, когда один из ваших include возвращает true, значение будет истинным, в противном случае оно будет ложным. Это прекрасно работает с ES6.
источник
Это можно сделать, используя некоторые / все методы Array и RegEx.
Чтобы проверить, присутствуют ли ВСЕ слова из списка (массива) в строке:
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
Чтобы проверить, присутствует ли ЛЮБОЕ слово из списка (массива) в строке:
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
источник
Не лучший ответ и не самый чистый, но я думаю, что он более снисходительный. Например, если вы хотите использовать одни и те же фильтры для всех ваших проверок. На самом деле
.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"]
источник
Вот спорный вариант:
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
источник
Еще один!
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)
источник
Расширение собственного прототипа String:
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
источник
Как насчет
['hello', 'hi', 'howdy'].includes(str)
?источник
['hello', 'hi', 'howdy'].includes('hello, how are you ?')
возвращаетсяfalse
, а OP запрашивает решение, которое возвращаетсяtrue
.