meerdere voorwaarden voor JavaScript .includes() methode

Ik vraag me af of er een manier is om meerdere voorwaarden toe te voegen aan een .includes-methode, bijvoorbeeld:

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

Stel je voor dat de komma ‘of’ aangeeft.

Er wordt nu gevraagd of de string hallo, hi ofhowdy bevat. Dus alleen als één, en slechts één van de voorwaarden waar is.

Is er een methode om dat te doen?


Antwoord 1, autoriteit 100%

U kunt de methode .somegebruiken waarnaar wordt verwezen door hier.

De methode some()test of ten minste één element in de array
slaagt voor de test
geïmplementeerd door de geleverde functie.

// test cases
const str1 = 'hi hello, how do you do?';
const str2 = 'regular string';
const str3 = 'hello there';
// do the test strings contain these terms?
const conditions = ["hello", "hi", "howdy"];
// run the tests against every element in the array
const test1 = conditions.some(el => str1.includes(el));
const test2 = conditions.some(el => str2.includes(el));
// strictly check that contains 1 and only one match
const test3 = conditions.reduce((a,c) => a + str3.includes(c), 0) == 1;
// display results
console.log(`Loose matching, 2 matches "${str1}" => ${test1}`);
console.log(`Loose matching, 0 matches "${str2}" => ${test2}`);
console.log(`Exact matching, 1 matches "${str3}" => ${test3}`);

Snippet uitvouwen


Antwoord 2, autoriteit 17%

Met includes(), nee, maar je kunt hetzelfde bereiken met REGEX via test():

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

Of, als de woorden uit een dynamische bron komen:

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

De REGEX-aanpak is een beter idee omdat u de woorden kunt matchen als echte woorden, niet als substrings van anderewoorden. Je hebt alleen het woord grensmarkering \bnodig, dus:

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

Antwoord 3, autoriteit 12%

Dat zou moeten werken, zelfs als één, en slechts één van de voorwaarden waar is:

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

Antwoord 4, autoriteit 8%

Je zou ook zoiets als dit kunnen doen:

const str = "hi, there"
const res = str.includes("hello") || str.includes("hi") || str.includes('howdy');
console.log(res);

Snippet uitvouwen


Antwoord 5, autoriteit 3%

Dat kan worden gedaan door sommige/elkemethoden van Array en RegEx te gebruiken.

Om te controleren of ALLEwoorden uit list(array) aanwezig zijn in de string:

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

Om te controleren of EENwoorden uit lijst(array) aanwezig zijn in de tekenreeks:

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

Antwoord 6

Niet het beste antwoord en ook niet het schoonste, maar ik denk dat het meer toegeeflijk is.
Like als je dezelfde filters wilt gebruiken voor al je controles.
Eigenlijk werkt .filter()met een array en retourneert een gefilterde array (die ik ook gebruiksvriendelijker vind).

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"]

Antwoord 7

Hier is een controversiëleoptie:

String.prototype.includesOneOf = function(arrayOfStrings) {
  if(!Array.isArray(arrayOfStrings)) {
    throw new Error('includesOneOf only accepts an array')
  }
  return arrayOfStrings.some(str => this.includes(str))
}

Hiermee kunt u dingen doen als:

'Hi, hope you like this option'.toLowerCase().includesOneOf(["hello", "hi", "howdy"]) // True

Antwoord 8

Nog een!

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)

Snippet uitvouwen


Antwoord 9

const givenArray = ['Hi , how are you', 'how are you', 'howdy, how you doing']
const includeValues = ["hello", "hi", "howdy"]
const filteredStrArray = givenArray.filter(str => includeValues.some(value => str.toLowerCase().includes(value)))
console.log(filteredStrArray);

Snippet uitvouwen


Antwoord 10

Uitbreiding van het oorspronkelijke prototype van 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);
        }
    });
}

Hiermee kunt u dingen doen als:

console.log('Hi, hope you like this option'.toLowerCase().contains(["hello", "hi", "howdy"])); // True

Antwoord 11

1 regel oplossing:

String/Array.prototype.includes(‘hallo’ || ‘hoi’ || ‘howdy’);

let words = 'cucumber, mercy, introduction, shot, howdy'
words.includes('hi' || 'howdy' || 'hello') // true
words.includes('hi' || 'hello') // false

Antwoord 12

Hoe zit het met ['hello', 'hi', 'howdy'].includes(str)?

Other episodes