Teste para vários casos em um comutador, como um OR (||)


239

Como você usaria a switch casequando precisar testar a ou b no mesmo caso?

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

3
possível duplicata de usar ou operador na instrução switch javascript - é 100% a sua pergunta;)
Felix Kling

Descobri que usar vírgulas apenas duas opções permitidas para cada caso.
Agus Widiarsa eu fiz

Respostas:


563

Você pode usar o fall-through:

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

69
É chamado de fall-through .
Felix Kling

2
Descobri isso antes de postar a pergunta, mas achei que seria útil para a comunidade, pois não está bem documentada em nenhum lugar ... obrigado @SLaks por sua resposta também.
Andres

Oi @kei Eu sei que este não é o lugar certo para isso, mas você respondeu minha última pergunta corretamente stackoverflow.com/questions/21049005/… você gostaria de repassar sua resposta?
quer

1
Eu também poderia esclarecer o ponto: depois que um caso é avaliado como verdadeiro, é isso. Não há mais casos verificados, apenas todas as instruções executadas até o final: ou seja, uma "quebra"; instruções ou se o interruptor for encerrado.
BeauCielBleu


118

Como as outras respostas explicaram como fazê-lo sem realmente explicar por que funciona:

Quando o switchexecuta, localiza a primeira caseinstrução correspondente e, em seguida, executa cada linha de código após a opção até atingir uma breakinstrução ou o final da switch(ou uma returninstrução para deixar toda a função que contém). Quando você omite deliberadamente o breakcódigo para que o código abaixo caseseja executado também, isso é chamado de falha . Portanto, para a exigência do OP:

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

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

Esquecer de incluir breakinstruções é um erro de codificação bastante comum e é a primeira coisa que você deve procurar se switchnão estiver funcionando da maneira esperada. Por esse motivo, algumas pessoas gostam de colocar um comentário para dizer "falhar" para deixar claro quando as declarações de quebra foram omitidas de propósito. Eu faço isso no exemplo a seguir, pois é um pouco mais complicado e mostra como alguns casos podem incluir código a ser executado antes que eles caiam:

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

Você também pode (opcionalmente) incluir um defaultcaso, que será executado se nenhum dos outros casos corresponder - se você não incluir um defaulte nenhum caso corresponder, nada acontecerá. Você pode (opcionalmente) passar para o caso padrão.

Portanto, no meu segundo exemplo, se someVarfor 1, ele chamaria someFunction()e você veria quatro alertas, uma vez que ocorre em vários casos, alguns dos quais com alertas. É someVar3, 4 ou 5, você verá dois alertas. Se someVarfor 7, você verá "Algo mais" e, se for 8 ou qualquer outro valor, verá "O fim".


4
O // queda através de comentário fazer minha parada phpstorm me avisando sobre a queda-through instrução switch, obrigado :)
Getz

Você pode usar return em vez de break se o switch estiver em uma função que você chama para retornar algum objeto: switch (action.type) {case ADD: {return newState; } case DELETE: {retorne newState; } padrão: {estado de retorno; }}
Dominika

14

Você precisa fazer dois caserótulos.

O controle passará do primeiro rótulo para o segundo, para que ambos executem o mesmo código.


9

Você tem que mudar isso!

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

1
Este método é muito inovador :-) Eu gosto disso. Mas, como ele usa mais caracteres do que o clássico "queda-through", torna-se menor interessante :)
AlexLaforge

1
O @AlexLaforge é o mais estranho e irônico que, em outra pergunta do tipo stackouverflow, essa resposta foi totalmente negativa. Mas, no entanto, apoio esta resposta e concordo, que é uma boa solução para condições flexíveis.
AlexNikonov

3

Esqueça switche break, vamos brincar if. E em vez de afirmar

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

vamos criar várias matrizes com casos e verificá-lo com 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

Use vírgulas para separar maiúsculas e minúsculas

switch (pageid)
{
    case "listing-page","home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.