Testuj wiele przypadków w przełączniku, takich jak OR (||)

239

Jak byś użył a, switch casekiedy musisz przetestować a lub b w tym samym przypadku?

switch (pageid) {
  case "listing-page" || "home-page":
    alert("hello");
    break;
  case "details-page":
    alert("goodbye");
    break;
}
Andres
źródło
3
możliwy duplikat użycia operatora OR w instrukcji przełącznika javascript - to twoje pytanie w 100%;)
Felix Kling
Zauważyłem, że za pomocą przecinków dozwolone są tylko 2 opcje dla każdego przypadku.
Agus Widiarsa I zrobiłem

Odpowiedzi:

563

Możesz użyć awaryjnego:

switch (pageid)
{
    case "listing-page":
    case "home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}
kei
źródło
69
To się nazywa upadek .
Felix Kling
2
Dowiedziałem się tego przed opublikowaniem pytania, ale pomyślałem, że przyda się ono społeczności, ponieważ nigdzie nie jest dobrze udokumentowane ... dziękuję @SLaks za odpowiedź.
Andres
Cześć @kei Wiem, że to nie jest właściwe miejsce na to, ale odpowiedziałeś poprawnie na moje ostatnie pytanie stackoverflow.com/questions/21049005/... czy chcesz ponownie opublikować swoją odpowiedź?
Leon Gaban,
1
Równie dobrze mógłbym wyjaśnić punkt: gdy sprawa zostanie oceniona jako prawdziwa, to wszystko. Nie są sprawdzane żadne przypadki, tylko wszystkie instrukcje wykonane do końca: tzn. „Przerwa”; instrukcja lub jeśli przełącznik zostanie zakończony.
BeauCielBleu
inne przykłady tutaj w dokumentach MDN
Luca Reghellin
118

Ponieważ inne odpowiedzi wyjaśniły, jak to zrobić, nie wyjaśniając, dlaczego to działa:

Kiedy switchwykonuje, znajduje pierwszą pasującą caseinstrukcję, a następnie wykonuje każdy wiersz kodu za przełącznikiem, aż trafi albo na breakinstrukcję, albo na koniec switch(lub returninstrukcję, aby opuścić całą zawierającą funkcję). Gdy umyślnie pominiesz breakkod, tak aby kod pod następnym casezostał również wykonany, to się nazywa przejście awaryjne . Tak więc dla wymagań PO:

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

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

Zapominanie o dołączaniu breakinstrukcji jest dość powszechnym błędem w kodowaniu i jest pierwszą rzeczą, na którą powinieneś zwrócić uwagę, jeśli switchnie działa tak, jak się spodziewałeś. Z tego powodu niektórzy ludzie lubią wstawiać komentarz, aby powiedzieć „wpadnij”, aby wyjaśnić, kiedy instrukcje break zostały celowo pominięte. Robię to w poniższym przykładzie, ponieważ jest to nieco bardziej skomplikowane i pokazuje, w jaki sposób niektóre przypadki mogą zawierać kod do wykonania, zanim się przewrócą:

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

Możesz także (opcjonalnie) dołączyć defaultsprawę, która zostanie wykonana, jeśli żaden z pozostałych przypadków nie będzie pasował - jeśli nie podasz żadnej defaulti nie będzie pasujących przypadków, nic się nie stanie. Możesz (opcjonalnie) przejść do domyślnego przypadku.

Tak więc w moim drugim przykładzie, jeśli someVarjest to 1, wywołałoby to, someFunction()a następnie zobaczyłbyś cztery alerty, które przechodzą przez wiele przypadków, z których niektóre mają alerty pod nimi. Jest someVar3, 4 lub 5, zobaczysz dwa alerty. Jeśli someVarjest 7, zobaczysz „Coś innego”, a jeśli jest to 8 lub dowolna inna wartość, zobaczysz „Koniec”.

nnnnnn
źródło
4
// komentarz przechodzący powoduje, że moja phpstorm przestaje ostrzegać mnie przed instrukcją przełączania awaryjnego, dzięki :)
Getz
Możesz użyć return zamiast break, jeśli przełącznik jest w funkcji, którą wywołujesz, aby zwrócić jakiś obiekt: switch (action.type) {case ADD: {return newState; } case DELETE: {return newState; } default: {return state; }}
Dominika
14

Musisz zrobić dwie caseetykiety.

Kontrola przejdzie od pierwszej etykiety do drugiej, więc oba wykonają ten sam kod.

SLaks
źródło
9

Musisz to zmienić!

switch (true) {
    case ( (pageid === "listing-page") || (pageid === ("home-page") ):
        alert("hello");
        break;
    case (pageid === "details-page"):
        alert("goodbye");
        break;
}
Stefano Favero
źródło
1
Ta metoda jest bardzo innowacyjna :-) Podoba mi się za to. Ale ponieważ używa więcej znaków niż klasyczne „przechodzenie”, staje się mniej interesujące :)
AlexLaforge
1
@AlexLaforge jest najbardziej dziwny i ironiczny, że w innym pytaniu dotyczącym przepływu stosu taka odpowiedź została całkowicie odrzucona. Niemniej jednak popieram tę odpowiedź i zgadzam się, że to dobre rozwiązanie dla elastycznych warunków.
AlexNikonov
3

Zapomnij switchi breakpozwala bawić się if. I zamiast twierdzić

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

pozwala stworzyć kilka tablic ze sprawami i sprawdzić to za pomocą Array.prototype.include ()

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");
}
khex
źródło
-6

Do oddzielenia wielkości liter używaj przecinków

switch (pageid)
{
    case "listing-page","home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}
Dinesh
źródło