Posso usare un’istruzione case / switch con due variabili?

Sono un principiante quando si tratta di JavaScript e ho capito che l’uso di una dichiarazione SWITCH / CASE è più veloce di un intero gruppo di istruzioni IF.

Tuttavia, voglio usare un’istruzione SWITCH / CASE con due variabili.

La mia app Web ha due cursori, ognuno dei quali ha cinque stati. Voglio che il comportamento sia basato sugli stati di queste due variabili. Ovviamente questo è un bel po ‘di molte dichiarazioni IF / THEN.

Un modo in cui pensavo di farlo era concatenare le due variabili in una sola e poi avrei potuto SWITCH / CASE.

C’è un modo migliore per realizzare un SWITCH / CASE usando due variabili?

Grazie !

Che ne dici di un operatore bit a bit? Invece di archi, hai a che fare con “enum”, che sembra più “elegante”.

 // 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; } 

Sono comunque d’accordo con gli altri, 25 casi in una logica caso-interruttore non sono troppo belli, e se-else potrebbe, in alcuni casi, “guardare” meglio. Comunque.

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

Se hai 5 possibilità per ognuna, otterrai 25 casi.

Innanzitutto, l’ opzione JavaScript non è più veloce di if/else (e talvolta molto più lenta) .

In secondo luogo, l’unico modo per utilizzare lo switch con più variabili è combinarle in un valore primitivo (stringa, numero, ecc.):

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

Ma, personalmente, preferirei vedere un insieme di dichiarazioni if / else .

Modifica : quando tutti i valori sono interi, sembra che l’interruttore possa essere superato se / else in Chrome. Vedi i commenti.

Non credo che un interruttore / caso sia più veloce di una serie di if / elseif’s. Fanno la stessa cosa, ma se / elseif puoi controllare più variabili. Non è ansible utilizzare un interruttore / caso su più di un valore.

È ansible assegnare a ciascuna posizione su ciascun dispositivo di scorrimento un valore binario diverso da 1 a 1000000000 e quindi utilizzare la sum.

Se l’azione di ciascuna combinazione è statica, puoi creare un array bidimensionale:

 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] ]; 

I numeri nell’esempio sopra possono essere qualsiasi cosa, come stringhe, array, ecc. Il recupero del valore ora è un one-liner (supponendo che gli slider abbiano un intervallo di valori di [0,5):

 var info = data[firstSliderValue][secondSliderValue]; 

Sì, ma non in modo normale. Dovrai usare l’interruttore come chiusura.

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); } } 

Sì, puoi anche fare:

  switch (true) { case (var1 === true && var2 === true) : //do something break; case (var1 === false && var2 === false) : //do something break; default: } 

Questo eseguirà sempre l’interruttore, praticamente proprio come se / else fosse più pulito. Continua a controllare le tue variabili nelle espressioni del caso.