web-dev-qa-db-fra.com

lodash _.contient une des valeurs multiples dans la chaîne

Existe-t-il un moyen dans lodash de vérifier si une chaîne contient l'une des valeurs d'un tableau?

Par exemple:

var text = 'this is some sample text';
var values = ['sample', 'anything'];

_.contains(text, values); // should be true

var values = ['nope', 'no'];
_.contains(text, values); // should be false
13
yeouuu

Une autre solution, probablement plus efficace que la recherche de toutes les valeurs, peut être de créer une expression régulière à partir des valeurs.

Bien que l'itération à travers chaque valeur possible impliquera une analyse multiple du texte, avec une expression régulière, une seule est suffisante.

function multiIncludes(text, values){
  var re = new RegExp(values.join('|'));
  return re.test(text);
}

document.write(multiIncludes('this is some sample text',
                             ['sample', 'anything']));
document.write('<br />');
document.write(multiIncludes('this is some sample text',
                             ['nope', 'anything']));

Limitation Cette approche échouera pour les valeurs contenant l'un des caractères suivants: \ ^ $ * + ? . ( ) | { } [ ] (elles font partie de la syntaxe d'expression régulière).

Si c'est une possibilité, vous pouvez utiliser la fonction suivante (de sindresorhus escape-string-regexp ) pour protéger (escape) les valeurs pertinentes:

function escapeRegExp(str) {
  return str.replace(/[\-\[\]\/\{\}\(\)\*\+\?\.\\\^\$\|]/g, "\\$&");
}

Cependant, si vous devez l'appeler pour chaque values possible, il est possible qu'une combinaison de Array.prototype.some et String.prototype.includes devient plus efficace (voir @Andy et mon autre réponse).

4
Quentin Roy

Utilisation _.some et _.includes :

_.some(values, (el) => _.includes(text, el));

DÉMO

27
Andy

Non. Mais c'est facile à implémenter en utilisant String.includes . Vous n'avez pas besoin de lodash .

Voici une fonction simple qui fait exactement cela:

function multiIncludes(text, values){
  return values.some(function(val){
    return text.includes(val);
  });
}

document.write(multiIncludes('this is some sample text',
                             ['sample', 'anything']));
document.write('<br />');
document.write(multiIncludes('this is some sample text',
                             ['nope', 'anything']));
2
Quentin Roy