Проверьте наличие нескольких случаев в переключателе, например, ИЛИ (||)

239

Как бы вы использовали a, switch caseкогда вам нужно проверить a или b в одном и том же случае?

switch (pageid) {
  case "listing-page" || "home-page":
    alert("hello");
    break;
  case "details-page":
    alert("goodbye");
    break;
}
Andres
источник
3
возможный дубликат использования оператора OR в операторе переключения javascript - это ваш вопрос на 100%;)
Феликс Клинг
Я нашел, используя запятые только 2 варианта, разрешенных в каждом случае.
Агус Видиарса, который я сделал

Ответы:

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
С таким же успехом я могу уточнить: если дело оценивается как истинное, вот оно. Больше не проверяются случаи, только все операторы, выполненные до конца: то есть "break;" инструкция или если переключатель прекращен.
BeauCielBleu
другие примеры здесь, в документах MDN
Лука Регеллин
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она работает не так, как вы ожидали. По этой причине некоторые люди любят вставлять комментарий, чтобы сказать «провалиться», чтобы прояснить, когда операторы break были специально пропущены. Я делаю это в следующем примере, поскольку он немного сложнее и показывает, как некоторые случаи могут включать в себя код, выполняемый до того, как они провалится:

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()а затем вы увидите четыре предупреждения, поскольку оно проходит через несколько случаев, некоторые из которых имеют предупреждения под ними. Это someVar3, 4 или 5, вы увидите два оповещения. Если someVarэто 7, вы увидите «Нечто другое», а если это 8 или любое другое значение, вы увидите «Конец».

NNNNNN
источник
4
// Отбрасывающий комментарий заставляет мою остановку phpstorm предупреждать меня об операторе переключения провала, спасибо :)
Getz
Вы можете использовать return вместо break, если switch находится в функции, которую вы вызываете для возврата какого-либо объекта: switch (action.type) {case ADD: {return newState; } case DELETE: {return newState; } по умолчанию: {возвращаемое состояние; }}
Доминика
14

Вам нужно сделать две caseметки.

Элемент управления будет переходить от первой метки ко второй, поэтому они оба будут выполнять один и тот же код.

SLaks
источник
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.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
источник
-6

Используйте запятые для разделения регистра

switch (pageid)
{
    case "listing-page","home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}
Динеш
источник