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 indexOfcar il peut bien tester la présence de NaNla liste, et peut correspondre à des éléments de tableau manquants tels que celui du milieu dans [1, , 2]la undefined. includesfonctionne é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.includessur 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 isInListproprié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 indexOffonctionne toujours. Cependant, pour IE8 et versions antérieures, vous aurez besoin d'un polyfill.
Si indexOfrenvoie -1, l'élément n'est pas dans la liste. Gardez cependant à l'esprit que cette méthode ne vérifiera pas correctement NaNet qu'elle peut correspondre à un undefinedélément explicite , elle ne peut pas correspondre à un élément manquant undefinedcomme dans le tableau [1, , 2].
Polyfill pour indexOfou includesdans 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.prototypesoit la meilleure réponse à long terme. La modification Objectet les Arrayprototypes 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 ... inrenverra 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 oflieu 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 includescomme indiqué ci-dessus.