En SQL, nous pouvons voir si une chaîne est dans une liste comme ceci:
Column IN ('a', 'b', 'c')
Quelle est la bonne façon de procéder en JavaScript? C'est tellement maladroit de faire ça:
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 7 car c'est pour une page intranet d'entreprise. Donc ['a', 'b', 'c'].indexOf(str) !== -1
, ne fonctionnera pas nativement sans sucre syntaxique.
javascript
string
list
ErikE
la source
la source
Réponses:
Vous pouvez appeler
indexOf
:la source
Array.prototype.indexOf
est qu'il ne fonctionnera pas sur IE, malheureusement même IE8 n'a pas cette méthode.Array.indexOf
existe avant de remplacerArray.prototype.indexOf
ce qui n'est pas la même chose. Je recommanderais l'implémentation de Mozilla disponible ici: developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/…EcmaScript 6
Si vous utilisez ES6, vous pouvez construire un tableau des éléments et utiliser
includes
:Cela a des avantages inhérents plus
indexOf
car il peut bien tester la présence deNaN
la liste, et peut correspondre à des éléments de tableau manquants tels que celui du milieu dans[1, , 2]
laundefined
.includes
fonctionne également sur des tableaux de type JavaScript tels queUint8Array
.Si vous êtes préoccupé par la prise en charge du navigateur (comme pour IE ou Edge), vous pouvez vérifier
Array.includes
sur CanIUse.Com , et si vous souhaitez cibler un navigateur ou une version de navigateur manquanteincludes
, je recommande polyfill.io pour le polyfilling.Sans tableau
Vous pouvez ajouter une nouvelle
isInList
propriété aux chaînes comme suit:Ensuite, utilisez-le comme ceci:
Vous pouvez faire la même chose pour
Number.prototype
.Array.indexOf
Si vous utilisez un navigateur moderne, cela
indexOf
fonctionne toujours. Cependant, pour IE8 et versions antérieures, vous aurez besoin d'un polyfill.Si
indexOf
renvoie -1, l'élément n'est pas dans la liste. Gardez cependant à l'esprit que cette méthode ne vérifiera pas correctementNaN
et qu'elle peut correspondre à unundefined
élément explicite , elle ne peut pas correspondre à un élément manquantundefined
comme dans le tableau[1, , 2]
.Polyfill pour
indexOf
ouincludes
dans IE, ou tout autre navigateur / version sans supportSi vous ne souhaitez pas utiliser un service comme polyfill.io comme mentionné ci-dessus, vous pouvez toujours inclure dans vos propres polyfills personnalisés conformes aux normes du code source. Par exemple, Mozilla Developer Network en a un pour
indexOf
.Dans cette situation où j'ai dû faire une solution pour Internet Explorer 7, j'ai "roulé ma propre" version plus simple de la
indexOf()
fonction qui n'est pas conforme aux normes:Cependant, je ne pense pas que la modification
Array.prototype
soit la meilleure réponse à long terme. La modificationObject
et lesArray
prototypes en JavaScript peuvent entraîner de graves bugs. Vous devez décider si cela est sûr dans votre propre environnement. Il est important de noter que l'itération d'un tableau (lorsque Array.prototype a ajouté des propriétés) avecfor ... in
renverra le nouveau nom de la fonction comme l'une des clés:Votre code peut fonctionner maintenant, mais au moment où quelqu'un dans le futur ajoutera une bibliothèque ou un plugin JavaScript tiers qui ne protège pas avec zèle contre les clés héritées, tout peut casser.
L'ancienne façon d'éviter cette rupture est, pendant l'énumération, de vérifier chaque valeur pour voir si l'objet l'a réellement en tant que propriété non héritée avec
if (arr.hasOwnProperty(x))
et seulement ensuite de travailler avecx
.La nouvelle façon de ES6 pour éviter ce problème extra-clé est d'utiliser au
of
lieu dein
,for (let x of arr)
. Cependant, à moins que vous ne puissiez garantir que tout votre code et vos bibliothèques tierces respectent strictement cette méthode, alors aux fins de cette question, vous voudrez probablement simplement utiliserincludes
comme indiqué ci-dessus.la source
indexOf
fourni par MDN. Il fait essentiellement la même chose mais avec quelques courts-circuits pour une évaluation facile.La plupart des réponses suggèrent la
Array.prototype.indexOf
méthode, le seul problème est qu'elle ne fonctionnera sur aucune version d'IE avant IE9.Comme alternative, je vous laisse deux autres options qui fonctionneront sur tous les navigateurs:
la source
"HiFooThere"
- j'irais avec à la/^(?:Foo|Bar|Baz)$/
place (début de chaîne, groupe non capturant, fin de chaîne).indexOf
est désormais pris en charge dans IE 9 et supérieur selon MDN .Les tableaux ont une
indexOf
méthode qui peut être utilisée pour rechercher des chaînes:la source
Un truc que j'ai utilisé est
Vous pourriez faire quelque chose comme
la source
var i=a.length;while (i--) {/*use a[i]*/}
c'est la méthode de boucle la plus rapide (si l'ordre inverse est acceptable).Voici la mienne:
Celui-ci est plus rapide si vous êtes d'accord pour passer un tableau:
Voici le jsperf: http://jsperf.com/bmcgin-inlsit
la source
Array
le prototype de: peut-être quelque chose commeArray.prototype.contains
.RegExp
est universel, mais je comprends que vous travaillez avec des tableaux. Alors, découvrez cette approche. Je l'utilise pour l'utiliser, et c'est très efficace et très rapide!Vous pouvez également appliquer certaines modifications, à savoir:
Bon mot
Insensible à la casse
Et plein d'autres!
la source
Utiliser indexOf (cela ne fonctionne pas avec IE8).
Pour prendre en charge IE8, vous pouvez implémenter l'indexOf de Mozilla.
Expressions régulières via String.prototype.match (docs).
la source
On dirait que vous devez utiliser la fonction in_array.
jQuery -> inArray
Prototype -> Array.indexOf
Ou, voyez ces exemples si vous n'utilisez pas jQuery ou Prototype:
Note stylistique: les variables nommées thisthing thatthing, devraient être nommées pour vous dire quelque chose sur ce qu'elles contiennent (nom).
la source
En plus de
indexOf
(ce que d'autres affiches ont suggéré), l'utilisation de Enumerable.include () du prototype peut rendre cela plus net et concis:la source
Merci pour la question et la solution utilisant la méthode Array.indexOf.
J'ai utilisé le code de cette solution pour créer une fonction inList () qui, à l'OMI, rendrait l'écriture plus simple et la lecture plus claire:
USAGE:
la source
'Houston'.inList(['LA', 'New York', 'Houston'])
. Peutif (!String.prototype.inList) {String.prototype.inList = function(arr) {return arr.indexOf(this) >= 0};}
- être ou en utilisant votrewhile
méthode.Je suis surpris que personne n'ait mentionné une fonction simple qui prend une chaîne et une liste.
la source
int
, où comme certaines personnes pourraient rencontrer cette question à la recherche d'unbool
retour. Je pensais que cela pourrait aider quelques personnes.Ma solution se traduit par une syntaxe comme celle-ci:
Et je l'implémente en étendant le prototype d'objet de base, comme ceci:
Nous pourrions également nommer la méthode isInArray (mais probablement pas inArray) ou simplement isIn.
Avantages: Simple, direct et auto-documenté.
la source
myValues[key];
où mesValeurs est un objet et la clé est n'importe quelle chaîne ou nombre.Une version simplifiée de la réponse de SLaks fonctionne également:
.... puisque les chaînes sont en quelque sorte des tableaux eux-mêmes. :)
Si nécessaire, implémentez la fonction indexof pour Internet Explorer comme décrit précédemment.
la source