Несколько условий для JavaScript.includes() метод
просто интересно, существует ли способ добавить несколько условий к методу .includes, например:
var value = str.includes("hello", "hi", "howdy");
представьте себе запятые "или"
(он спрашивает теперь, содержит ли строка hello hi или howdy, поэтому только если одно и только одно из условий истинно.
Есть ли способ сделать это?
Ответы
Ответ 1
Это должно работать, даже если одно и только одно из условий верно:
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));
Ответ 2
Вы можете использовать метод .some
здесь.
Метод some()
проверяет, прошел ли хотя бы один элемент в массиве тест, реализованный предоставленной функцией.
// test cases
var str1 = 'hi, how do you do?';
var str2 = 'regular string';
// does the test strings contains this terms?
var conditions = ["hello", "hi", "howdy"];
// run the tests agains 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);
Ответ 3
С помощью include 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
Ответ 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
Здесь спорная опция :
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.
Чтобы проверить, присутствует ли ВСЕ слов из списка (массива) в строке:
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
Ответ 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)