Test per più casi in uno switch, come un OR (||)


239

Come si usa una switch casequando è necessario prova per una o B nello stesso caso?

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

3
possibile duplicato dell'utilizzo dell'operatore OR nell'istruzione switch javascript - è al 100% la tua domanda;)
Felix Kling

Ho trovato utilizzando le virgole solo 2 opzioni consentite per ogni caso.
Agus Widiarsa ho fatto il

Risposte:


563

È possibile utilizzare fall-through:

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

69
Si chiama fall-through .
Felix Kling,

2
L'ho scoperto prima di pubblicare la domanda, ma ho pensato che sarebbe stato utile per la comunità poiché non è ben documentato da nessuna parte ... grazie @SLaks per la tua risposta.
Andres,

Ciao @kei So che questo non è il posto giusto per questo, ma hai risposto correttamente alla mia ultima domanda stackoverflow.com/questions/21049005/… vorresti ripubblicare la tua risposta?
Leon Gaban,

1
Potrei anche chiarire il punto: una volta che un caso è stato valutato come vero, è tutto. Non vengono più controllati casi, solo tutte le istruzioni eseguite fino alla fine: cioè una "pausa"; istruzione o se l'interruttore è terminato.
BeauCielBleu,


118

Poiché le altre risposte hanno spiegato come farlo senza effettivamente spiegare perché funziona:

Quando switchviene eseguito, trova la prima caseistruzione corrispondente e quindi esegue ogni riga di codice dopo lo switch fino a quando non colpisce breakun'istruzione o la fine dell'istruzione switch(o returnun'istruzione per lasciare l'intera funzione di contenimento). Quando si omette deliberatamente in breakmodo che anche il codice sotto il successivo casevenga eseguito, questo viene chiamato fall-through . Quindi per il requisito del PO:

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

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

Dimenticare di includere le breakdichiarazioni è un errore di codifica abbastanza comune ed è la prima cosa che dovresti cercare se switchnon stai funzionando come previsto. Per questo motivo ad alcune persone piace inserire un commento per dire "fall through" per chiarire quando le dichiarazioni di rottura sono state omesse di proposito. Lo faccio nell'esempio seguente poiché è un po 'più complicato e mostra come alcuni casi possono includere il codice da eseguire prima che cadano:

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

Puoi anche (facoltativamente) includere un defaultcaso, che verrà eseguito se nessuno degli altri casi corrisponde - se non includi una corrispondenza defaulte nessun caso, allora non accade nulla. È possibile (facoltativamente) passare al caso predefinito.

Quindi nel mio secondo esempio, se someVarè 1, chiamerebbe someFunction()e quindi vedresti quattro avvisi mentre scorre attraverso più casi alcuni dei quali hanno avvisi sotto di essi. È someVar3, 4 o 5 vedresti due avvisi. Se someVarè 7 vedresti "Qualcos'altro" e se è 8 o qualsiasi altro valore vedresti "La fine".


4
Il // fall through comment mi fa smettere di phpstorm di avvertirmi dell'istruzione fall-through switch, grazie :)
Getz

È possibile utilizzare return anziché break se lo switch è in una funzione chiamata per restituire un oggetto: switch (action.type) {case ADD: {return newState; } case DELETE: {return newState; } impostazione predefinita: {stato di ritorno; }}
Dominika,

14

Devi creare due caseetichette.

Il controllo passerà dalla prima etichetta alla seconda, quindi eseguiranno entrambi lo stesso codice.


9

Devi cambiarlo!

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

1
Questo metodo è molto innovativo :-) Mi piace per quello. Ma, poiché utilizza più personaggi del classico "fall-through", diventa meno interessante :)
AlexLaforge,

1
@AlexLaforge il più strano e ironico che in un'altra domanda stackouverflow tale risposta è stata totalmente declassata. Tuttavia, sostengo questa risposta e sono d'accordo, questa è una buona soluzione per condizioni flessibili.
AlexNikonov,

3

Dimentica switche break, consente di giocare con if. E invece di affermare

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

consente di creare più array con case e controllarlo con Array.prototype.includes ()

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

Utilizzare le virgole per separare il caso

switch (pageid)
{
    case "listing-page","home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.