web-dev-qa-db-fra.com

Puis-je utiliser une instruction case/switch avec deux variables?

Je suis un novice en matière de JavaScript et je croyais comprendre que l’utilisation d’une seule déclaration SWITCH/CASE était plus rapide que toute une série de déclarations IF. 

Cependant, je souhaite utiliser une instruction SWITCH/CASE avec deux variables.

Mon application Web a deux curseurs, chacun ayant cinq états. Je veux que le comportement soit basé sur les états de ces deux variables. Évidemment, c’est beaucoup de déclarations IF/THEN.

Une façon de penser que de faire cela consistait à concaténer les deux variables en une, puis à SWITCH/CASE.

Existe-t-il un meilleur moyen de réaliser un SWITCH/CASE en utilisant deux variables?

Merci !

21
user918967

Que diriez-vous d'un opérateur de bitwise? Au lieu de chaînes, vous avez affaire à des "enums", qui ont l'air plus "élégants".

// Declare slider's state "enum"
var SliderOne = {
    A: 1,
    B: 2,
    C: 4,
    D: 8,
    E: 16
};

var SliderTwo = {
    A: 32,
    B: 64,
    C: 128,
    D: 256,
    E: 512
};

// Set state
var s1 = SliderOne.A,
    s2 = SliderTwo.B;

// Switch state
switch (s1 | s2) {
    case SliderOne.A | SliderTwo.A :
    case SliderOne.A | SliderTwo.C :
        // Logic when State #1 is A, and State #2 is either A or C
        break;
    case SliderOne.B | SliderTwo.C :
        // Logic when State #1 is B, and State #2 is C
        break;
    case SliderOne.E | SliderTwo.E :
    default:
        // Logic when State #1 is E, and State #2 is E or
        // none of above match
        break;


}

Je suis cependant d'accord avec les autres, 25 cas dans une logique de commutation ne sont pas trop jolis, et si-sinon, dans certains cas, "mieux" En tous cas.

20
DashK
var var1 = "something";
var var2 = "something_else";
switch(var1 + "|" + var2) {
    case "something|something_else":
        ...
        break;
    case "something|...":
        break;
    case "...|...":
        break;
}

Si vous avez 5 possibilités pour chacune, vous obtiendrez 25 cas.

16
Halcyon

Tout d'abord, JavaScript de switch n'est pas plus rapide que if/else (et parfois beaucoup plus lent) }.

Deuxièmement, la seule façon d'utiliser switch avec plusieurs variables consiste à les combiner en une valeur primitive (chaîne, nombre, etc.):

var stateA = "foo";
var stateB = "bar";
switch (stateA + "-" + stateB) {
    case "foo-bar": ...
    ...
}

Mais, personnellement, je préférerais voir un ensemble d'instructions ifelse.

_/Edit: lorsque toutes les valeurs sont des entiers, il semble que le commutateur puisse surpasser si/else dans Chrome. Voir les commentaires.

8
David Wolever

Je ne crois pas qu'un commutateur/boîtier est plus rapide qu'une série de if/elseif. Ils font la même chose, mais si/elseif, vous pouvez vérifier plusieurs variables. Vous ne pouvez pas utiliser un commutateur/cas sur plus d'une valeur.

4
Ryan P

Vous pouvez attribuer à chaque position sur chaque curseur une valeur binaire différente allant de 1 à 1000000000, puis travailler avec la somme.

3
TecBrat

Si l'action de chaque combinaison est statique, vous pouvez créer un tableau à deux dimensions:

var data = [
  [1,2,3,4,5],
  [6,7,8,9,10],
  [11,12,13,14,15],
  [16,17,18,19,20],
  [21,22,23,24,25]
];

Les nombres de l'exemple ci-dessus peuvent être n'importe quoi, tels que chaîne, tableau, etc.

var info = data[firstSliderValue][secondSliderValue];
3
Ja͢ck

Oui, mais pas de manière normale. Vous devrez utiliser le commutateur comme fermeture.

ex:-

function test(input1, input2) {
     switch (true) {
        case input1 > input2:
                    console.log(input1 + " is larger than " + input2);
                    break;
        case input1 < input2:
                    console.log(input2 + " is larger than " + input1);
        default:
                    console.log(input1 + " is equal to " + input2);
      }
   }
1
Parul

Oui, vous pouvez aussi faire:

    switch (true) {

     case (var1 === true && var2 === true) :
       //do something
       break;
     case (var1 === false && var2 === false) :
       //do something
       break;

      default:

    }

Cela exécutera toujours le commutateur, à peu près comme si/sinon, mais semble plus propre. Continuez simplement à vérifier vos variables dans les expressions de casse.

0
aabiro