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


101

疑問に思っているのですが、.includesメソッドに複数の条件を追加する方法はありますか。次に例を示します。

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

カンマの状態「または」を想像してみてください。

文字列にhello、hi howdyのいずれが含まれているかを尋ねています。したがって、条件の1つだけが真である場合に限り、

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


1
or少なくとも1つの一致で十分であることを意味します。
robertklep 2016年

1
:代わりの方法を含んで解決策を探しているのは、このようなのindexOf試すことができます ['hello', 'hi', 'howdy'].indexOf(str)
Skander Jenhani

@SkanderJenhaniは、コメントする前に、少なくとも読んで試してみてください。あなたの提案は常に返します-1
chankruze

2
何ができるの&&
アローラ

回答:


30

それは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));

ただのメモ。:Google Appsのスクリプトでこれをしようと誰もが例外TypeErrorなりますstackoverflow.com/questions/51291776/...
クルトLeadley

206

ここで.some参照されている方法を使用できます。

このsome()メソッドは、配列内の少なくとも1つの要素が、提供された関数によって実装されたテストに合格するかどうかをテストします。

// 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()はメソッドであり、演算子ではありません。そうでなければ、良い答えです。
Mitya

取られたポイント。ありがとう
dinigo

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

インクルードの1つがtrueを返す場合は常に、値はtrueになります。それ以外の場合は、falseになります。これはES6で完全に正常に機能します。


OPは、「つまり、条件が1つだけで、1つだけが真である場合に限ります」と述べています。スニペットは、3つの単語すべてを含む文字列に対してtrueを返しますが、OPはfalseを返します。
DaneBrouwer20年

4

これは、ArrayおよびRegExのいくつか/すべてのメソッドを使用し実行できます。

list(array)のすべての単語が文字列に存在するかどうかを確認するには:

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

ワオ。これは私の両方の質問に答えました。どうもありがとうございました!!!!
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
Basj
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.