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;
}
Andres
fonte
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;
}
kei
fonte
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
outros exemplos aqui nos documentos MDN
Luca Reghellin
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".

nnnnnn
fonte
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.

SLaks
fonte
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;
}
Stefano Favero
fonte
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");
}
khex
fonte
-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;
}
Dinesh
fonte