Vérifier si une chaîne de caractères contient un élément D'un tableau dans JavaScript

Comment puis-je vérifier si une chaîne contient tout élément d'un tableau? Je veux filtrer un tableau si l'élément a une chaîne de caractères. Veuillez 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' ]. 'apple' devrait être supprimé, mais il ne l'est pas.

code ci-dessus seulement "banane" filtrée, pas "pomme". J'ai beaucoup de mots-clés à filtre. Est-il un moyen plus facile?

16
demandé sur Tunaki 2016-05-25 08:15:31

6 réponses

le problème réside dans la boucle for, qui ne se répète qu'une seule fois depuis que return termine la fonction, coupant la boucle for dans le processus. Ainsi, vous pouvez mettre à jour le code de la façon suivante pour que la fonction ne revienne 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 la réduction de la fonction, vous pouvez utiliser every() et indexOf() méthode

la méthode du "tout" exécute la fonction de callback fournie une fois pour chaque élément présent dans le tableau jusqu'à ce qu'il en trouve un où callback renvoie une valeur falsy (une valeur qui devient false lorsqu'elle est convertie en booléen). Si un tel élément est trouvé, la méthode retourne false. Sinon, si callback renvoie une valeur true pour tous les éléments, tous retourneront true. callback n'est invoqué que pour les index du tableau qui ont des valeurs attribuées; il n'est pas invoqué pour les index qui ont été supprimés ou qui n'ont jamais été affectées des valeurs.(depuis)

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 pourriez même utiliser un regex ici. Générez regex en utilisant le tableau et utilisez test() à 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);

Consultez cette réponse pour la chaîne regex conversion: pouvez-vous créer des regexes JavaScript à la volée en utilisant des variables string?

16
répondu Pranav C Balan 2017-05-23 11:53:15

C'est 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!

checkerune fonction de flèche.

! signifie qu'il exclura tous les éléments qui ne remplissent pas les conditions.

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

à partir de Array.prototype.some() docs on MDM

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

String.prototype.includes() docs on MDM


comme certaines des dernières fonctionnalités D'ECMAScript ne sont pas prises en charge par tous les navigateurs, vous devez utiliser Babel pour compiler votre code en ECMAScript 5.

14
répondu Michał Perłakowski 2016-11-01 15:41:19

je pense que cela peut être grandement simplifiée. Il y a déjà un JavaScript intégré pour vérifier ces choses. 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
répondu etchesketch 2016-05-25 13:51:01

Par exemple par la construction d'une RegExp et les essais contre:

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

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

var r = new RegExp(prohibited.map(escapeForRegex).join("|"));
arr.filter(function(v){ return !r.test(v) });
0
répondu Thomas 2016-05-25 05:37:03

Certains diront que c'est une pratique incertaine, mais vous trouverez peut-être utile de disposer d'une méthode que vous pouvez exécuter sur la chaîne directement - dans ce cas, vous pourriez élargir le JavaScript Chaîne objet à l'aide de Chaîne de caractères.prototype.

Comme ceci...

String.prototype.containsAny = String.prototype.containsAny || function(arr) {
  for (var i = 0; i < arr.length; i++) {
    if (this.indexOf(arr[i]) > -1) {
      return true;
    }
  }
  return false;
};

Comme vous pouvez le voir dans cet exemple, il sera par défaut à toute définition d'un containsAny méthode. Gardez à l'esprit: chaque fois que vous augmentez objets encastrés, c'est une bonne idée de vérifier au moins d'abord la présence de la propriété – peut-être qu'un jour elle existera... \_(ツ)_/

découvrez ce violon pour l'utilisation ou voir ci-dessous:

var str = 'This is a sentence as a string.';

console.log(str.containsAny(['string1', 'string2', 'string3'])); // -> returns false
console.log(str.containsAny(['string', 'string1', 'string2'])); // -> returns true
<script src="//cdn.simpledigital.net/common/js/extensions/String.prototypeHelpers.js"></script>
0
répondu blizzrdof77 2018-07-18 18:18:14
<script>
$(document).ready(function(){
    var arr = ['banana', 'monkey banana', 'apple', 'kiwi', 'orange'];

    var prohibited = ['banana', 'apple'];

 $.each(arr,function(arr_index,arr_value)
 {
   $.each(prohibited,function(p_index,p_value)
   {
      if(arr_value ==  p_value)
      {
          alert(arr_value+" = "+p_value);
      }
      else
      {
          alert(arr_value+" != "+p_value);
      }
   });
});

});
</script>
-1
répondu Vijay Wilson 2016-05-25 05:29:06