кілька умов для методу JavaScript .includes ()


95

Просто цікаво, чи є спосіб додати кілька умов до методу .includes, наприклад:

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

Уявіть, кома ставить "або".

Зараз він запитує, чи містить рядок привіт, привіт чи привітання. Тож, лише якщо одна, і лише одна з умов є істинною.

Чи існує спосіб зробити це?


1
orозначатиме, що принаймні одного збігу буде достатньо.
robertklep

Замість того, щоб шукати рішення за допомогою методу ['hello', 'hi', 'howdy'].indexOf(str)
include

Відповіді:


29

Це має спрацювати, навіть якщо виконується одна, і лише одна з умов:

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 / ...
Курт Лідла

193

Ви можете використовувати .someметод, на який посилаються тут .

У 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);


3
Примітка: some()це метод, а не оператор. В іншому випадку хороша відповідь.
Митя

Очко взяте. Дякую
Дініго

Це повинна бути прийнята відповідь
matebende

26

Чи не З 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

Це не спрацює, якщо слова містять спеціальні символи регулярного виразу. Крім того, це не буде задовольняти очевидну вимогу OP, що вона збігається, лише якщо є збіг з одним словом.

17

Ви також можете зробити щось подібне:

const str = "hi, there"

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

console.log(res);

Всякий раз, коли одне з ваших включає return true, значення буде true, інакше воно буде помилковим. Це чудово працює з ES6.


OP сказав: "Отже, лише якщо одна, і лише одна з умов є істинною". Ваш фрагмент поверне true для рядка, який містить усі три слова, де OP бажає, щоб він повернув false.
Дейн Брауер

4

Це можна зробити, використовуючи деякі / будь-які методи 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

Ого. це відповіло на обидва мої запитання. Дуже дякую !!!!
BoundForGlory

2

Не найкраща відповідь і не найчистіша, але, на мою думку, вона є більш дозвільною. Як, якщо ви хочете використовувати однакові фільтри для всіх своїх чеків. Насправді .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"]

2

Ось суперечливий варіант:

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

1

Інший!

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)


-1

Розширений рідний прототип:

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

-2

Як щодо ['hello', 'hi', 'howdy'].includes(str)?


1
Ні, це не працює: ['hello', 'hi', 'howdy'].includes('hello, how are you ?')повертається false, тоді як OP запитує рішення, яке повертається true.
Бас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.