webentwicklung-frage-antwort-db.com.de

Typoskriptumschaltung mit logischem und

Ich versuche, eine switch-Anweisung zu schreiben, aber es scheint nicht so zu funktionieren, wie ich es will.

getExerciseDescription(exerciseId, intensity_level){

    alert(exerciseId + " " + intensity_level)

    switch (exerciseId && intensity_level) {
        case (1 && 1):
        this.header="Exercise 1 Level 1";
        this.instructions="Exercise 1 Level 1";
        break;
        case (1 && 2):
        this.header="Exercise 1 Level 2";
        this.instructions="Exercise 1 Level 2";
        break;  


        case (2 && 1):
        this.header="Exercise 2 Level 1";
        this.instructions="Exercise 2 Level 1";
        break;  
        case (2 && 2):
        this.header="Exercise 2 Level 2";
        this.instructions="Exercise 2 Level 2";
        break;

        default:
        this.header="Default";
        this.instructions="Default";
        break;
    }

    return new Popup(this.header, this.instructions);
} 

Die Warnungen geben 2 und 1, aber der zurückgegebene Wert ist für (1 && 1). Wieso ist es so? Wie kann ich das beheben?

6
Thinker

Sie können eine switch einfach nicht so verwenden. (1 && 1) == (2 && 1) == 1 und (1 && 2) == (2 && 2) == 2, also machen Sie das Äquivalent von: 

getExerciseDescription(exerciseId, intensity_level){

    alert(exerciseId + " " + intensity_level)

    switch (exerciseId && intensity_level) {
        case (1):
        this.header="Exercise 1 Level 1";
        this.instructions="Exercise 1 Level 1";
        break;
        case (2):
        this.header="Exercise 1 Level 2";
        this.instructions="Exercise 1 Level 2";
        break;  


        case (1):
        this.header="Exercise 2 Level 1";
        this.instructions="Exercise 2 Level 1";
        break;  
        case (2):
        this.header="Exercise 2 Level 2";
        this.instructions="Exercise 2 Level 2";
        break;

        default:
        this.header="Default";
        this.instructions="Default";
        break;
    }

    return new Popup(this.header, this.instructions);
} 

Natürlich werden die beiden unteren Fälle niemals ausgeführt. Sie sollten besser nur if- und else if-Anweisungen verwenden oder, falls gewünscht, auch geschachtelte Schalter verwenden. 

Sie könnten auch so etwas tun:

switch (exerciseId + " " + intensity_level) {
    case("1 1"): ...
    case("1 2"): ...
    case("2 1"): ...
    case("2 2"): ...
9
Charles Clayton

So wird eine switch -Anweisung nicht bewertet. Für Ihr Szenario wird immer die 2. Ganzzahl im logischen und && ausgewertet. 

(Weitere Informationen zu Logische Operatoren )

Logisches AND (&&)

expr1 && expr2

Gibt expr1 zurück, wenn es in false konvertiert werden kann. Andernfalls wird Ausdruck2 zurückgegeben. Bei Verwendung mit booleschen Werten gibt && also true zurück, wenn beide Operanden true sind. Andernfalls wird false zurückgegeben.

Sie brauchen eigentlich nicht einmal einen Schalter, Sie können ihn mit einer einfachen if schreiben.

if (exerciseId <= 2 && intensity_level <= 2){
    this.header=`Exercise ${exerciseId} Level ${intensity_level}`;
    this.instructions=`Exercise ${exerciseId} Level ${intensity_level}`;
} else {
    this.header="Default";
    this.instructions="Default";
}
1

Die logischen Operatoren &&, || und ! geben immer true oder false zurück, sodass die möglichen Schalterfälle nur wahr und falsch sind. Sie sollten nur mit Zeichenketten oder Zahlenfällen gehen.

0
Babar Bilal