web-dev-qa-db-fra.com

Vérifier si une chaîne contient un élément d'un tableau en JavaScript

Comment puis-je vérifier si une chaîne contient un élément quelconque d'un tableau? Je veux filtrer un tableau si l'élément a une chaîne. S'il vous plaît voir ci-dessous le code.

var arr = ['banana', 'monkey banana', 'Apple', 'kiwi', 'orange'];

function checker(value) {
  var prohibited = ['banana', 'Apple'];

  for (var i = 0; i < prohibited.length; i++) {
    if (value.indexOf(prohibited[i]) == -1) {
      return true;
    } else {
      return false;
    }
  }
}

arr = arr.filter(checker);
console.log(arr);

Le résultat est [ 'Apple', 'kiwi', 'orange' ]. Le 'Apple' devrait être supprimé, mais ce n'est pas le cas. 

Le code ci-dessus ne fait que filtrer "banane", pas "Apple". J'ai beaucoup de mots-clés à filtrer. Y a-t-il un moyen plus facile?

18
Juntae

Le problème réside dans la boucle for, qui ne se répète qu'une fois, car return renvoie la fonction et coupe la boucle for dans le processus. Ainsi, vous pouvez mettre à jour le code de manière à ce que la fonction ne retourne qu'une fois la boucle for terminée.

var arr = ['banana', 'monkey banana', 'Apple', 'kiwi', 'orange'];

function checker(value) {
  var prohibited = ['banana', 'Apple'];

  for (var i = 0; i < prohibited.length; i++) {
    if (value.indexOf(prohibited[i]) > -1) {
      return false;
    }
  }
  return true;
}

arr = arr.filter(checker);
console.log(arr);


Pour réduire la fonction, vous pouvez utiliser les méthodes every() et indexOf().

La méthode 'every' exécute la fonction de rappel fournie une fois pour chaque élément présent dans le tableau jusqu'à ce qu'il en trouve un où le rappel renvoie une valeur falsy (une valeur qui devient false lors de la conversion en booléenne). Si un tel élément est trouvé, chaque méthode retourne immédiatement false. Sinon, si callback renvoie une valeur true pour tous les éléments, chacun retournera true. callback n'est appelé que pour les index du tableau auxquels des valeurs ont été assignées; il n'est pas appelé pour les index supprimés ou auxquels aucune valeur n'a jamais été affectée. (EXTRAIT DE CE CHAPITRE)

var arr = ['banana', 'monkey banana', 'Apple', 'kiwi', 'orange'];

function checker(value) {
  var prohibited = ['banana', 'Apple'];
  return prohibited.every(function(v) {
    return value.indexOf(v) == -1;
  });
}

arr = arr.filter(checker);
console.log(arr);


Pour les navigateurs plus anciens, cochez l’option polyfill de chaque méthode .


Vous pouvez même utiliser une expression régulière ici. Générez une expression rationnelle à l'aide du tableau et utilisez test() pour vérifier la correspondance.

var arr = ['banana', 'monkey banana', 'Apple', 'kiwi', 'orange'];

function checker(value) {
  var prohibited = ['banana', 'Apple'];
  var regex = new RegExp(prohibited.map(function(s) {
    return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
  }).join('|'));
  return !regex.test(value);
}

arr = arr.filter(checker);
console.log(arr);

Reportez-vous à cette réponse pour la conversion chaîne en expression rationnelle: Pouvez-vous créer des expressions rationnelles JavaScript à la volée à l'aide de variables de chaîne?

16
Pranav C Balan

Cela peut être aussi simple que cela:

const arr = ['banana', 'monkey banana', 'Apple', 'kiwi', 'orange'];

const checker = value =>
  !['banana', 'Apple'].some(element => value.includes(element));

console.log(arr.filter(checker));

ECMAScript 6 FTW!

checker utilise une fonction de flèche .

Le ! signifie qu'il exclura tous les éléments qui ne répondent pas aux conditions.

La méthode some() teste si un élément du tableau réussit le test mis en oeuvre par la fonction fournie.

depuis Array.prototype.some() docs sur MDM

La méthode includes() détermine si une chaîne peut être trouvée dans une autre chaîne, en renvoyant true ou false selon le cas.

depuis String.prototype.includes() docs sur MDM


Certaines fonctionnalités ECMAScript les plus récentes ne étant pas prises en charge par tous les navigateurs, vous devez utiliser Babel pour compiler votre code dans ECMAScript 5.

20

Je pense que cela peut être grandement simplifié. Il existe déjà une fonctionnalité intégrée à javascript pour vérifier ces éléments. Considérer:

var arr = ['banana', 'monkey banana', 'Apple', 'kiwi', 'orange'];

function checker(value) {
  var prohibited = ['banana', 'Apple'];

  // indexOf() returns -1 if the element doesn't exist in the prohibited array
  return prohibited.indexOf( value ) == -1;
}

arr = arr.filter(checker);
console.log(arr);
2
etchesketch

Par exemple, en construisant un RegExp et en le testant:

var arr = ['banana', 'monkey banana', 'Apple', 'kiwi', 'orange'];
var prohibited = ['banana', 'Apple'];

var escapeForRegex = function(str) {
  return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
};

var r = new RegExp(prohibited.map(escapeForRegex).join("|"));
arr.filter(function(v){ return !r.test(v) });
0
Thomas