web-dev-qa-db-ja.com

JavaScript .includes()メソッドの複数の条件

ただ疑問に思って、複数の条件を.includesメソッドに追加する方法はありますか、例えば:

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

コンマの状態が「または」であることを想像してください(文字列にhello hi or howdyが含まれているかどうかを確認します。

それを行う方法はありますか?

36
user6234002

それは1つでも機能するはずで、条件の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));
13
kevin ternet

here で参照される.someメソッドを使用できます。

some()メソッドは、配列内の少なくとも1つの要素がtestを通過するかどうかをテストします提供された機能によって。

// 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);
92
dinigo

includes()で、いいえ、しかしtest()経由でREGEXで同じことを達成できます:

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

または、単語が動的なソースから来ている場合:

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

REGEXアプローチは、other単語の部分文字列ではなく、実際の単語として単語を照合できるため、より良いアイデアです。 Wordの境界マーカー\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
17
Utkanos

論争の的 オプションは次のとおりです。

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
0
James Broad

最良の答えではなく、最もクリーンでもありませんが、より寛容だと思います。すべてのチェックに同じフィルターを使用する場合のように。実際、.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"]
0
Romingo

これは、ArrayおよびRegExのsome/everyメソッドを使用して実行できます。

List(array)の単語の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

List(array)の単語の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
0
Denys Rusov