webentwicklung-frage-antwort-db.com.de

Kann ich eine case/switch-Anweisung mit zwei Variablen verwenden?

Ich bin ein Neuling, wenn es um JavaScript geht, und ich war der Meinung, dass die Verwendung einer SWITCH/CASE-Anweisung schneller ist als eine ganze Reihe von IF-Anweisungen. 

Ich möchte jedoch eine SWITCH/CASE-Anweisung mit zwei Variablen verwenden.

Meine Web-App verfügt über zwei Schieberegler, von denen jeder fünf Zustände hat. Ich möchte, dass das Verhalten auf den Zuständen dieser beiden Variablen basiert. Offensichtlich ist das eine ganze Menge von IF/THEN-Anweisungen.

Ich habe darüber nachgedacht, die beiden Variablen zu einer zu verketten, und dann könnte ich das wechseln.

Gibt es eine bessere Möglichkeit, einen SWITCH/CASE mit zwei Variablen auszuführen?

Vielen Dank !

21
user918967

Wie wäre es mit einem bitweisen Operator? Anstelle von Strings haben Sie es mit "enums" zu tun, was "eleganter" wirkt.

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


}

Ich stimme jedoch mit anderen überein, 25 Fälle in einer Switch-Case-Logik sind nicht zu schön, und If-else könnte in einigen Fällen besser "aussehen". Sowieso.

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

Wenn Sie jeweils 5 Möglichkeiten haben, erhalten Sie 25 Fälle.

16
Halcyon

Erstens ist die JavaScript-Variable switch ist nicht schneller als if/else (und manchmal viel langsamer) .

Zweitens besteht die einzige Möglichkeit, switch mit mehreren Variablen zu verwenden, darin, diese zu einem primitiven Wert (Zeichenfolge, Zahl usw.) zu kombinieren:

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

Ich persönlich würde jedoch lieber eine Reihe von ifelse-Anweisungen sehen.

_/Edit: Wenn alle Werte Ganzzahlen sind, kann es sein, dass der Switch die Leistung von/else in Chrome übertrifft. Siehe die Kommentare.

8
David Wolever

Ich glaube nicht, dass ein Switch/Case schneller ist als eine Reihe von if/elseif's. Sie tun dasselbe, aber wenn/elseif's, können Sie mehrere Variablen prüfen. Sie können einen Schalter/Fall nicht für mehr als einen Wert verwenden.

4
Ryan P

Sie können jeder Position auf jedem Schieberegler einen anderen Binärwert von 1 bis 1000000000 .__ zuweisen und dann mit der Summe arbeiten.

3
TecBrat

Wenn die Aktion jeder Kombination statisch ist, können Sie ein zweidimensionales Array erstellen:

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

Die Zahlen im obigen Beispiel können beliebige Zeichen sein, wie z. B. Zeichenfolge, Array usw. Das Abrufen des Werts ist jetzt ein Einzeiler (vorausgesetzt, die Schieberegler haben einen Wertebereich von [0,5])

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

Ja, aber nicht auf normale Weise. Sie müssen den Schalter als Schließung verwenden.

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

Ja können Sie auch tun:

    switch (true) {

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

      default:

    }

Dies führt den Schalter immer aus, ziemlich genau wie if/else, sieht aber sauberer aus. Überprüfen Sie einfach Ihre Variablen in den Case-Ausdrücken.

0
aabiro