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

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

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


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”.


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.


9

Musisz to zmienić!

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

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

-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;
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.