386 votes

Déterminer si la chaîne est dans la liste dans le JavaScript

En SQL, nous pouvons voir si une chaîne de caractères en une liste comme suit:

Column IN ('a', 'b', 'c')

Ce qui est une bonne façon de le faire en javascript? Il est tellement maladroit pour ce faire:

if (expression1 || expression2 || str === 'a' || str === 'b' || str === 'c') {
   // do something
}

Et je ne suis pas sûr au sujet de la performance ou de la clarté de cette:

if (expression1 || expression2 || {a:1, b:1, c:1}[str]) {
   // do something
}

Ou on pourrait utiliser la fonction de commutation:

var str = 'a',
   flag = false;

switch (str) {
   case 'a':
   case 'b':
   case 'c':
      flag = true;
   default:
}

if (expression1 || expression2 || flag) {
   // do something
}

Mais c'est un horrible gâchis. Des idées?

Mise à JOUR

Je n'ai pas pensé à mentionner que, dans ce cas, je dois utiliser IE comme c'est pour un intranet d'entreprise de la page. Donc, ['a', 'b', 'c'].indexOf(str) !== -1 ne fonctionne pas nativement sans une certaine syntaxe de sucre.

Pour les navigateurs qui ne supportent pas l' indexOf voici un pleinement conformes aux normes de la version de la fonction indexOf. Et voici ma version (car je ne fais pas de liste de la position ou de l'esprit de la traversée en sens inverse, ce devrait être plus rapide):

if (!Array.prototype.indexOf) {
   Array.prototype.indexOf = function(item) {
      var i = this.length;
      while (i--) {
         if (this[i] === item) return i;
      }
   }
   return -1;
}

453voto

ErikE Points 18233

SLaks réponse a été un bon début, mais pas "correct" car il ne fonctionne pas sous IE. Alors que je n'ai pas parler de la nécessité d'IE dans mon post initial, il ne mentionne pas son code ne fonctionne pas dans IE.

J'ai finalement utilisé le indexOf() et de "roulé ma propre" pour IE:

if (!Array.prototype.indexOf) {
   Array.prototype.indexOf = function(item) {
      var i = this.length;
      while (i--) {
         if (this[i] === item) return i;
      }
      return -1;
   }
}

323voto

SLaks Points 391154

Vous pouvez appeler indexOf:

if (['a', 'b', 'c'].indexOf(str) >= 0) {
    //do something
}

55voto

CMS Points 315406

La plupart des réponses suggèrent l' Array.prototype.indexOf méthode, le seul problème est qu'il ne fonctionne pas sur toutes les version de IE.

Comme une alternative, je vous laisse deux options qui fonctionnent sur tous les navigateurs:

if (/Foo|Bar|Baz/.test(str)) {
  // ...
}


if (str.match("Foo|Bar|Baz")) {
  // ...
}

32voto

harto Points 28479

Les tableaux ont un indexOf méthode qui peut être utilisée pour rechercher des chaînes:

js> a = ['foo', 'bar', 'baz']
foo,bar,baz
js> a.indexOf('bar')
1
js> a.indexOf('quux')
-1

14voto

voyager Points 17283

Un truc que j'ai utilisé est

>>> ("something" in {"a string":"", "somthing":"", "another string":""})
false
>>> ("something" in {"a string":"", "something":"", "another string":""})
true

Vous pourriez faire quelque chose comme

>>> a = ["a string", "something", "another string"];
>>> b = {};
>>> for(var i=0; i<a.length;i++){b[a[i]]="";} /* Transform the array in a dict */
>>> ("something" in b)
true

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X