92 votes

Javascript : la plus jolie façon de comparer une valeur contre plusieurs valeurs

Quelle est la plus jolie façon de comparer une valeur à plusieurs options ?

Je sais qu'il existe de nombreuses façons de le faire, mais je recherche la plus soignée.

je demande parce que j'espérais que cela était réalisable (ce n'est pas le cas, de toute évidence quand vous le regardez):

 if (foobar == (foo||bar) ) {
     //do something
}

151voto

david Points 5559

N'essayez pas d'être trop sournois, surtout lorsque cela affecte inutilement les performances. Si vous avez vraiment tout un tas de comparaisons à faire, formatez-le simplement correctement.

 if (foobar === foo ||
    foobar === bar ||
    foobar === baz ||
    foobar === pew) {
     //do something
}

85voto

Ce que j'utilise pour faire, c'est mettre ces valeurs multiples dans un tableau comme

 var options = [foo, bar];

puis, utilisez indexOf()

 if(options.indexOf(foobar) > -1){
   //do something
}

pour la beauté :

 if([foo, bar].indexOf(foobar) +1){
   //you can't get any more pretty than this :)
}

et pour les navigateurs plus anciens : ( https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/IndexOf )

 if (!Array.prototype.indexOf) {
    Array.prototype.indexOf = function (searchElement /*, fromIndex */ ) {
        "use strict";
        if (this == null) {
            throw new TypeError();
        }
        var t = Object(this);
        var len = t.length >>> 0;
        if (len === 0) {
            return -1;
        }
        var n = 0;
        if (arguments.length > 0) {
            n = Number(arguments[1]);
            if (n != n) { // shortcut for verifying if it's NaN
                n = 0;
            } else if (n != 0 && n != Infinity && n != -Infinity) {
                n = (n > 0 || -1) * Math.floor(Math.abs(n));
            }
        }
        if (n >= len) {
            return -1;
        }
        var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0);
        for (; k < len; k++) {
            if (k in t && t[k] === searchElement) {
                return k;
            }
        }
        return -1;
    }
}

24voto

Guffa Points 308133

Vous pouvez utiliser un commutateur :

 switch (foobar) {
  case foo:
  case bar:
    // do something
}

18voto

lucideer Points 2098

Juste pour le plaisir, puisque ce Q&A semble concerner la microanalyse syntaxique, une toute petite modification de la (des) suggestion(s) d'André Alçada Padez :

(et bien sûr en tenant compte du shim/shiv/polyfill pré-IE9 qu'il a inclus)

 if (~[foo, bar].indexOf(foobar)) {
    // pretty
}

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