Déterminez si la chaîne est dans la liste JavaScript

Dans SQL, nous pouvons voir si une chaîne se trouve dans une liste:

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

Quel est le bon moyen de le faire en JavaScript? Il est si maladroit de le faire:

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

Et je ne suis pas sûr de la performance ou de la clarté de ceci:

 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 désordre horrible. Des idées?

Dans ce cas, je dois utiliser Internet Explorer pour une page intranet d'entreprise. Ainsi, ['a', 'b', 'c'].indexOf(str) !== -1 ne fonctionnera pas de manière native sans un certain sucre syntaxique.

Vous pouvez appeler indexOf :

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

La plupart des réponses suggèrent la méthode Array.prototype.indexOf , le seul problème est qu'il ne fonctionnera pas sur une version IE avant IE9.

En alternative, je vous laisse deux autres options qui fonctionneront sur tous les navigateurs:

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

EcmaScript 6

Si vous utilisez ES6, vous pouvez construire un tableau des éléments, et utiliser includes , ['a', 'b', 'c'].includes('b') .

Sans un tableau

Vous pouvez ajouter une nouvelle propriété isInList aux chaînes comme suit:

 if (!String.prototype.isInList) { String.prototype.isInList = function() { let value = this.valueOf(); for (let i = 0, l = arguments.length; i < l; i += 1) { if (arguments[i] === value) return true; } return false; } } 

Ensuite, utilisez-le comme tel:

 'fox'.isInList('weasel', 'fox', 'stoat') // true 'fox'.isInList('weasel', 'stoat') // false 

Vous pouvez faire la même chose pour Number.prototype .

Polyfill pour indexOf utilisant IE8 et antérieur

À court d'ES6, vous pouvez faire la même chose avec indexOf dans la plupart des navigateurs (où IE8 et versions antérieures ne font pas partie du «plus»).

Dans cette situation, j'ai finalement utilisé la fonction indexOf () et "Rollled my own" pour Internet Explorer 7.

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

Cependant, à long terme, je ne pense pas que la modification de Array.prototype soit la meilleure réponse. La modification des prototypes d' Object et de Array en JavaScript peut entraîner des bogues sérieux. Vous devez décider si le faire est sécurisé dans votre propre environnement. La note principale est que l'itération d'un tableau (lorsque Array.prototype a ajouté des propriétés) avec for ... in renverra le nouveau nom de fonction comme l'une des clés:

 Array.prototype.blah = function() { console.log('blah'); }; for (var x in [1, 2, 3]) { console.log(x); } // Result: 0 1 2 blah // Extra member iterated over 

Les tableaux ont une méthode indexOf 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 

Une astuce que j'ai utilisée 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 

Voici la mienne:

 String.prototype.inList=function(list){ return (Array.apply(null, arguments).indexOf(this.toString()) != -1) } var x = 'abc'; if (x.inList('aaa','bbb','abc')) console.log('yes'); else console.log('no'); 

Celui-ci est plus rapide si vous êtes OK avec le passage d'un tableau:

 String.prototype.inList=function(list){ return (list.indexOf(this.toString()) != -1) } var x = 'abc'; if (x.inList(['aaa','bbb','abc'])) console.log('yes') 

Voici le jsperf: http://jsperf.com/bmcgin-inlsit

RegExp est universel, mais je comprends que vous travaillez avec des tableaux. Alors, vérifiez cette approche. Je l'utilise, et c'est très efficace et rapide!

 var str = 'some string with a'; var list = ['a', 'b', 'c']; var rx = new RegExp(list.join('|')); rx.test(str); 

Vous pouvez également appliquer certaines modifications, à savoir:

Bon mot

 new RegExp(list.join('|')).test(str); 

Insensible aux cas

 var rx = new RegExp(list.join('|').concat('/i')); 

Et plein d'autres!

On dirait que vous devez utiliser la fonction in_array.

JQuery -> inArray

Prototype -> Array.indexOf

Ou, voir ces exemples si vous n'utilisez pas jQuery ou Prototype:

Note stylistique: les variables appelées tout ce qui devrait être nommé pour vous dire quelque chose sur ce qu'ils contiennent (nom).

En plus de l' indexOf (que d'autres affiches ont suggéré), l'utilisation du prototype Enumerable.include () peut rendre cela plus propre et plus concis:

 var list = ['a', 'b', 'c']; if (list.include(str)) { // do stuff } 

Merci pour la question, et la solution en utilisant la méthode Array.indexOf.

J'ai utilisé le code de cette solution pour créer une fonction inList () qui, IMO, rend l'écriture plus simple et la lecture plus claire:

 function inList(psString, psList) { var laList = psList.split(','); var i = laList.length; while (i--) { if (laList[i] === psString) return true; } return false; } 

USAGE:

 if (inList('Houston', 'LA,New York,Houston') { // THEN do something when your string is in the list } 

Je suis surpris que personne n'ait mentionné une fonction simple qui prend une chaîne et une liste.

 function in_list(needle, hay) { var i, len; for (i = 0, len = hay.length; i < len; i++) { if (hay[i] == needle) { return true; } } return false; } var alist = ["test"]; console.log(in_list("test", alist)); 

Une version simplifiée de la réponse de SLaks fonctionne également:

 if ('abcdefghij'.indexOf(str) >= 0) { // Do something } 

… puisque les cordes sont une sorte de tableaux eux-mêmes. 🙂

Si nécessaire, implémentez la fonction indexof pour Internet Explorer comme décrit précédemment.

Ma solution résulte en une syntaxe comme ceci:

 // Checking to see if var 'column' is in array ['a', 'b', 'c'] if (column.isAmong(['a', 'b', 'c']) { // Do something } 

Et je l'implique en étendant le prototype d'objet de base, comme ceci:

 Object.prototype.isAmong = function (MyArray){ for (var a=0; a<MyArray.length; a++) { if (this === MyArray[a]) { return true; } } return false; } 

Nous pourrions également désigner la méthode isInArray (mais probablement pas inArray) ou simplement isIn.

Avantages: simple, direct et autodidacte.