Тест на кілька випадків в комутаторі, як АБО (||)


239

Як би ви використовували a, switch caseколи вам потрібно тестувати на a або b в тому самому випадку?

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

3
можливий дублікат використання АБО оператора в заяві переключення javascript - це на 100% ваше питання;)
Фелікс Клінг

Я знайшов використання комами лише 2 варіанти, дозволені в кожному випадку.
Agus Widiarsa I Зробив

Відповіді:


563

Ви можете використовувати пропуск:

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

69
Це називається пропускним шляхом .
Фелікс Клінг

2
Я дізнався це ще до того, як опублікував це запитання, але подумав, що це буде корисно для громади, оскільки це ніде не є добре задокументованим ... дякую @SLaks за те, що ви також відповіли.
Андрес

Привіт @kei Я знаю, що це не правильне місце для цього, але ви відповіли правильно на моє останнє запитання stackoverflow.com/questions/21049005/… Чи хотіли б ви перекласти свою відповідь?
Леон Габан

1
Я можу також уточнити пункт: Після того, як випадок оцінили справжнім, це все. Більше випадків не перевіряється, просто всі заяви, виконані до кінця: тобто "перерва"; інструкція або якщо перемикач припинено.
BeauCielBleu


118

Оскільки в інших відповідях було пояснено, як це зробити, фактично не пояснюючи, чому це працює:

Коли switchвиконується, він знаходить перше відповідне caseвисловлювання, а потім виконує кожен рядок коду після комутатора, поки він не потрапить або в breakоператор, або в кінець switch(або у returnзаяві, щоб залишити всю функцію, що містить). Коли ви навмисно опускаєте breakтак, що код під наступним також caseвиконується, що називається прохідним . Отже, для вимоги ОП:

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

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

Забути включення breakвисловлювань - досить поширена помилка кодування, і це перше, на що слід звернути увагу, якщо ваша switchробота не працює так, як ви очікували. З цієї причини деякі люди люблять ставити коментар, щоб сказати "провалитися", щоб зрозуміти, коли заяви про перерви були спеціально пропущені. Я роблю це в наступному прикладі, оскільки це трохи складніше і показує, як деякі випадки можуть включати код, який потрібно виконати до їх пропускання:

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

Ви також можете (необов'язково) включити defaultсправу, яка буде виконана, якщо жодна з інших справ не збігається - якщо ви не включитеdefault та жодні випадки, то нічого не відбувається. Ви можете (за бажанням) перейти до випадку за замовчуванням.

Отже, у моєму другому прикладі, якщо someVarце 1, він би зателефонував, someFunction()і тоді ви побачите чотири сповіщення, як це потрапляє через кілька випадків, у деяких з яких є сповіщення під ними. Якщо someVarце 3, 4 або 5, ви побачили б два сповіщення. Якщо someVarце 7, ви побачите "Щось інше", а якщо це 8 або будь-яке інше значення, ви побачите "Кінець".


4
// пропадати через коментар, змушуйте мій phpstorm перестати попереджати мене про заяву перемикання, що пропускається, дякую :)
Getz

Ви можете використовувати return замість перерви, якщо комутатор знаходиться у функції, яку ви викликаєте для повернення якогось об'єкта: switch (action.type) {case ADD: {return newState; } case DELETE: {return newState; } за замовчуванням: {return return; }}
Домініка

14

Вам потрібно зробити два case мітки.

Контроль перейде від першої мітки до другої, тож вони обидва будуть виконувати один і той же код.


9

Ви повинні переключити його!

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

1
Цей метод дуже інноваційний :-) Мені це подобається за це. Але, оскільки він використовує більше символів, ніж класичний "
прохід

1
@AlexLaforge - найдивніше та іронічне, що в іншому питанні потокового потоку така відповідь була цілком спростована. Але все-таки я підтримую цю відповідь і погоджуюся, це гарне рішення для гнучких умов.
AlexNikonov

3

Забудьте switchі break, давайте грати if. І замість того, щоб стверджувати

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

дозволяє створити декілька масивів із корпусами та перевірити їх за допомогою 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

Використовуйте коми для окремого відмінка

switch (pageid)
{
    case "listing-page","home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.