OR (||)과 같은 스위치에서 여러 사례를 테스트


239

같은 경우 switch casea 또는 b 를 테스트해야 할 때 a를 어떻게 사용 하시겠습니까?

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

3
javascript switch 문에 OR 연산자사용할 수 있음 -100 % 질문입니다.)
Felix Kling

쉼표를 사용하면 각 경우에 2 가지 옵션 만 허용됩니다.
Agus Widiarsa 내가

답변:


563

폴 스루를 사용할 수 있습니다.

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

69
이를 fall-through 라고 합니다 .
Felix Kling

2
질문을 게시하기 전에이 사실을 알았지 만 커뮤니티에 잘 설명되어 있지 않으므로 커뮤니티에 도움이 될 것이라고 생각했습니다 ... @ SLaks 감사합니다.
Andres

안녕하세요 @kei 나는 이것이 적절한 장소가 아니라는 것을 알고 있지만 마지막 질문에 올바르게 대답했습니다. stackoverflow.com/questions/21049005/… 답을 다시 게시 하시겠습니까?
레온 가반

1
요점을 명확히 할 수도 있습니다. 사례가 사실로 평가되면 그게 전부입니다. 더 이상 사례를 점검하지 않으며, 끝까지 실행 된 모든 명령문 만 : "break" 명령 또는 스위치가 종료 된 경우.
BeauCielBleu


118

다른 답변은 실제로 작동하는 이유를 설명하지 않고 수행하는 방법을 설명했기 때문에 :

switch실행되며, 제 매칭 발견 case문 후는 어느 돌 때까지 전환 후 각 코드 라인을 실행 break문 또는 끝 switch(또는 return전체를 포함하는 기능을 떠나 문). 의도적으로 생략하면 break다음 코드 case가 실행되어 폴 스루 (fall-through) 라고합니다 . OP의 요구 사항은 다음과 같습니다.

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사례를 포함하지 않고 사례가 일치하지 않으면 아무 일도 일어나지 않습니다. 선택적으로 기본 사례로 넘어갈 수 있습니다.

따라서 두 번째 예에서 someVar1 이면 1이 호출 someFunction()되고 여러 경우에 해당하는 일부 경고가 표시되는 4 개의 경고가 표시됩니다. Is someVar는 3, 4 또는 5이며 두 개의 경고가 표시됩니다. someVar7 이면 "다른 것"이 표시되고 8 또는 다른 값이면 "끝"이 표시됩니다.


4
// fall through comment는 내 phpstorm이 fall-through switch 문에 대해 경고하는 것을 중지시킵니다. 감사합니다 :)
Getz

스위치가 일부 객체를 반환하기 위해 호출하는 함수에있는 경우 break 대신 return 을 사용할 수 있습니다 . switch (action.type) {case ADD : {return newState; } case DELETE : {return newState; } 기본값 : {반환 상태; }}
도미니카

14

두 개의 case레이블 을 만들어야 합니다.

제어는 첫 번째 레이블에서 두 번째 레이블로 넘어가므로 둘 다 동일한 코드를 실행합니다.


9

당신은 그것을 전환해야합니다!

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

1
이 방법은 매우 혁신적입니다 :-) 나는 그것을 좋아합니다. 그러나, 그것은 고전은 "가을-을 통해"이,이 :) 덜 흥미가되는 것보다 더 많은 문자를 사용하기 때문에
AlexLaforge

1
@AlexLaforge는 다른 stackouverflow 질문에서 그러한 대답이 완전히 하향 조정되었다는 가장 이상하고 역설적입니다. 그럼에도 불구하고 나는이 답변을 지원하고 동의합니다. 유연한 조건에 적합한 솔루션입니다.
AlexNikonov

3

잊고 switchbreak함께 놀자 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;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.