web-dev-qa-db-fra.com

Plusieurs conditions pour la méthode JavaScript .includes ()

je me demandais simplement s'il y avait un moyen d'ajouter plusieurs conditions à une méthode .includes, par exemple:

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

imaginez que la virgule indique "ou" (il demande maintenant si la chaîne contient hello salut o ça va. Donc seulement si une, et une seule des conditions est vraie.

y a-t-il une méthode pour le faire?

36
user6234002

Cela devrait fonctionner même si une seule des conditions est vraie:

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

Vous pouvez utiliser la méthode .some Référencée ici .

La méthode some() teste si au moins un élément du tableau passe le test implémenté par la fonction fournie.

// 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

Avec includes(), non, mais vous pouvez obtenir le même résultat avec REGEX via test():

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

Ou, si les mots proviennent d'une source dynamique:

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

L’approche REGEX est une meilleure idée car elle vous permet de faire correspondre les mots en tant que mots réels et non en sous-chaînes de mots autres. Vous avez juste besoin du marqueur de limite de mots \b, alors:

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

Voici une option controversée :

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

Vous permettant de faire des choses comme:

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

Pas la meilleure réponse et pas la plus propre, mais je pense que c'est plus permissif. Par exemple, si vous souhaitez utiliser les mêmes filtres pour toutes vos vérifications. En fait, .filter() fonctionne avec un tableau et renvoie un tableau filtré (que je trouve plus facile à utiliser aussi).

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

Cela peut être fait en utilisant some/every méthodes de Array et RegEx.

Pour vérifier si TOUS LES des mots de la liste (tableau) sont présents dans la chaîne:

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

Pour vérifier si AUCUN des mots de la liste (tableau) sont présents dans la chaîne:

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