EcmaScript 6
Si vous utilisez ES6, vous pouvez construire un tableau des éléments et utiliser includes
:
['a', 'b', 'c'].includes('b')
Cela a des avantages inhérents plus indexOf
car il peut bien tester la présence de NaN
la liste, et peut correspondre à des éléments de tableau manquants tels que celui du milieu dans [1, , 2]
la undefined
. includes
fonctionne également sur des tableaux de type JavaScript tels que Uint8Array
.
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 manquante includes
, je recommande polyfill.io pour le polyfilling.
Sans tableau
Vous pouvez ajouter une nouvelle isInList
propriété 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 ceci:
'fox'.isInList('weasel', 'fox', 'stoat') // true
'fox'.isInList('weasel', 'stoat') // false
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 correctement NaN
et qu'elle peut correspondre à un undefined
élément explicite , elle ne peut pas correspondre à un élément manquant undefined
comme dans le tableau [1, , 2]
.
Polyfill pour indexOf
ou includes
dans IE, ou tout autre navigateur / version sans support
Si 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:
if (!Array.prototype.indexOf) {
Array.prototype.indexOf = function(item) {
var i = this.length;
while (i--) {
if (this[i] === item) return i;
}
return -1;
}
}
Cependant, je ne pense pas que la modification Array.prototype
soit la meilleure réponse à long terme. La modification Object
et les Array
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) avec for ... in
renverra le nouveau nom de la fonction comme l'une des clés:
Array.prototype.blah = function() { console.log('blah'); };
let arr = [1, 2, 3];
for (let x in arr) { console.log(x); }
// Result:
0
1
2
blah // Extra member iterated over!
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 avec x
.
La nouvelle façon de ES6 pour éviter ce problème extra-clé est d'utiliser au of
lieu de in
, 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 utiliser includes
comme indiqué ci-dessus.