174 votes

Vérifier l'égalité d'une variable par rapport à une liste de valeurs

Je vérifie une variable, disons foo pour l'égalité à un certain nombre de valeurs. Par exemple,

if( foo == 1 || foo == 3 || foo == 12 ) {
    // ...
}

Le fait est qu'il s'agit d'un code assez volumineux pour une tâche aussi triviale. J'ai trouvé ce qui suit :

if( foo in {1: 1, 3: 1, 12: 1} ) {
    // ...
}

mais cela ne me plaît pas du tout, car je dois donner des valeurs redondantes aux éléments de l'objet.

Quelqu'un connaît-il un moyen décent de vérifier l'égalité de plusieurs valeurs ?

210voto

Gumbo Points 279147

Vous pouvez utiliser un tableau et indexOf :

if ([1,3,12].indexOf(foo) > -1)

186voto

Alister Points 11531

Dans l'ECMA2016, vous pouvez utiliser la fonction comprend méthode. C'est la méthode la plus propre que j'ai vue. (Prise en charge par tous les principaux navigateurs)

if([1,3,12].includes(foo)) {
    // ...
}

11voto

pimvdb Points 66332

En utilisant les réponses fournies, j'ai obtenu les résultats suivants :

Object.prototype.in = function() {
    for(var i=0; i<arguments.length; i++)
       if(arguments[i] == this) return true;
    return false;
}

Il peut être appelé ainsi :

if(foo.in(1, 3, 12)) {
    // ...
}

Editer : J'ai découvert récemment ce "truc" qui est utile si les valeurs sont des chaînes et ne contiennent pas de caractères spéciaux. Dans le cas des caractères spéciaux, l'escamotage rend l'opération très laide, ce qui multiplie les risques d'erreur.

/foo|bar|something/.test(str);

Pour être plus précis, cela permet de vérifier la chaîne exacte, mais c'est encore une fois plus compliqué pour un simple test d'égalité :

/^(foo|bar|something)$/.test(str);

8voto

Javed Points 537

Il se peut que vous ayez une meilleure solution pour résoudre ce scénario, mais c'est l'autre solution que je préfère.

const arr = [1,3,12]
if( arr.includes(foo)) { // it will return true if you `foo` is one of array values else false
  // code here    
}

J'ai préféré la solution ci-dessus à la vérification de l'indexOf qui nécessite également de vérifier l'index.

comprend des documents

if ( arr.indexOf( foo ) !== -1 ) { }

7voto

nightcracker Points 34498

Il est facilement extensible et lisible :

switch (foo) {
    case 1:
    case 3:
    case 12:
        // ...
        break

    case 4:
    case 5:
    case 6:
        // something else
        break
}

Mais pas nécessairement plus facile :)

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