Test auf mehrere Fälle in einem Schalter, wie z. B. ein ODER (||)


239

Wie würden Sie a verwenden, switch casewenn Sie im selben Fall auf a oder b testen müssen ?

switch (pageid) {
  case "listing-page" || "home-page":
    alert("hello");
    break;
  case "details-page":
    alert("goodbye");
    break;
}

3
Mögliches Duplikat der Verwendung des OR-Operators in der Javascript-Switch-Anweisung - es ist zu 100% Ihre Frage;)
Felix Kling

Ich fand, dass die Verwendung von Kommas jeweils nur 2 Optionen erlaubte.
Agus Widiarsa Ich machte

Antworten:


563

Sie können Fall-Through verwenden:

switch (pageid)
{
    case "listing-page":
    case "home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}

69
Es heißt Durchfall .
Felix Kling

2
Ich habe dies herausgefunden, bevor ich die Frage gepostet habe, dachte aber, dass es für die Community nützlich sein würde, da es nirgendwo gut dokumentiert ist ... danke @SLaks für Ihre Antwort auch.
Andres

Hallo @kei, ich weiß, dass dies nicht der richtige Ort dafür ist, aber Sie haben meine letzte Frage richtig beantwortet. Stackoverflow.com/questions/21049005/… Möchten Sie Ihre Antwort erneut veröffentlichen?
Leon Gaban

1
Ich könnte genauso gut den Punkt klarstellen: Sobald ein Fall als wahr bewertet wurde, ist es das. Es werden keine Fälle mehr geprüft, nur alle Anweisungen werden bis zum Ende ausgeführt: dh eine "Pause"; Anweisung oder wenn der Schalter beendet ist.
BeauCielBleu


118

Da die anderen Antworten erklärten, wie es geht, ohne tatsächlich zu erklären, warum es funktioniert:

Wenn der switchBefehl ausgeführt wird, findet er die erste übereinstimmende caseAnweisung und führt dann jede Codezeile nach dem Wechsel aus, bis er entweder eine breakAnweisung oder das Ende der switch(oder eine returnAnweisung zum Verlassen der gesamten enthaltenen Funktion) trifft . Wenn Sie das absichtlich weglassen, breakdamit auch der Code unter dem nächsten caseausgeführt wird, spricht man von einem Durchfall . Also für die Anforderung des OP:

switch (pageid) {
   case "listing-page":
   case "home-page":
      alert("hello");
      break;

   case "details-page":
      alert("goodbye");
      break;
} 

Das Vergessen, breakAnweisungen einzuschließen, ist ein ziemlich häufiger Codierungsfehler und das erste, wonach Sie suchen sollten, wenn Sie switchnicht wie erwartet funktionieren. Aus diesem Grund geben einige Leute gerne einen Kommentar ein, um "durchfallen" zu sagen, um deutlich zu machen, wenn break-Anweisungen absichtlich weggelassen wurden. Ich mache das im folgenden Beispiel, da es etwas komplizierter ist und zeigt, wie einige Fälle Code enthalten können, der ausgeführt werden soll, bevor sie durchfallen:

switch (someVar) {
   case 1:
      someFunction();
      alert("It was 1");
      // fall through
   case 2:
      alert("The 2 case");
      // fall through
   case 3:
      // fall through
   case 4:
      // fall through
   case 5:
      alert("The 5 case");
      // fall through
   case 6:
      alert("The 6 case");
      break;

   case 7:
      alert("Something else");
      break;

   case 8:
      // fall through
   default:
      alert("The end");
      break;
}

Sie können auch (optional) einen defaultFall einschließen , der ausgeführt wird, wenn keiner der anderen Fälle übereinstimmt. Wenn Sie keinen defaultund keine Fälle angeben, geschieht nichts. Sie können (optional) auf den Standardfall zurückgreifen.

Wenn in meinem zweiten Beispiel someVar1 angezeigt wird, wird aufgerufen, someFunction()und dann werden vier Warnungen angezeigt, da mehrere Fälle durchlaufen werden, von denen einige Warnungen enthalten. Ist someVar3, 4 oder 5, würden Sie zwei Warnungen sehen. Wenn someVar7 ist, sehen Sie "Etwas anderes" und wenn es 8 oder ein anderer Wert ist, sehen Sie "Das Ende".


4
Der // Fall-Through-Kommentar lässt meinen PHP-Sturm aufhören, mich vor der Fall-Through-Switch-Anweisung zu warnen, danke :)
Getz

Sie können return anstelle von break verwenden, wenn sich der Schalter in einer Funktion befindet, die Sie aufrufen, um ein Objekt zurückzugeben: switch (action.type) {case ADD: {return newState; } case DELETE: {return newState; } default: {Rückgabestatus; }}
Dominika

14

Sie müssen zwei caseEtiketten erstellen.

Die Steuerung wechselt vom ersten zum zweiten Label, sodass beide denselben Code ausführen.


9

Du musst es wechseln!

switch (true) {
    case ( (pageid === "listing-page") || (pageid === ("home-page") ):
        alert("hello");
        break;
    case (pageid === "details-page"):
        alert("goodbye");
        break;
}

1
Diese Methode ist sehr innovativ :-) Ich mag es dafür. Aber da es mehr Zeichen als das klassische "Fall-Through" verwendet, wird es weniger interessant :)
AlexLaforge

1
@AlexLaforge das seltsamste und ironischste, dass in einer anderen Stackouverflow-Frage eine solche Antwort total abgelehnt wurde. Trotzdem unterstütze ich diese Antwort und stimme zu, dass dies eine gute Lösung für flexible Bedingungen ist.
AlexNikonov

3

Vergiss switchund breaklass uns spielen mit if. Und anstatt zu behaupten

if(pageid === "listing-page" || pageid === "home-page")

Lassen Sie uns mehrere Arrays mit Fällen erstellen und mit Array.prototype.includes () überprüfen.

var caseA = ["listing-page", "home-page"];
var caseB = ["details-page", "case04", "case05"];

if(caseA.includes(pageid)) {
    alert("hello");
}
else if (caseB.includes(pageid)) {
    alert("goodbye");
}
else {
    alert("there is no else case");
}

-6

Verwenden Sie Kommas, um Groß- und Kleinschreibung zu trennen

switch (pageid)
{
    case "listing-page","home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.