자바 스크립트 : 케이스 전환에서 조건 사용


88

멍청한 질문에 대해 죄송합니다. javascript switch-case 언어 요소에서 케이스에 대한 조건을 어떻게 사용할 수 있습니까? 아래 예에서와 같이 변수 liCount가 <= 5 및> 0 일 때 케이스가 일치해야합니다 . 그러나 내 코드가 작동하지 않습니다.

switch (liCount) {
    case 0:
        setLayoutState('start');
        var api = $('#UploadList').data('jsp');
        api.reinitialise();
        break;
    case (liCount<=5 && liCount>0):
        setLayoutState('upload1Row');
        var api = $('#UploadList').data('jsp');
        api.reinitialise();
        break;
    case (liCount<=10 && liCount>5):
        setLayoutState('upload2Rows');
        var api = $('#UploadList').data('jsp');
        api.reinitialise();
        break;
    case (liCount>10):
        var api = $('#UploadList').data('jsp');
        api.reinitialise();
        break;                  
}

조언을 해주셔서 감사합니다!


4
사용 u는 그 .. 수행하려는 경우 대신 if 문
— Naftali 닐 일명

3
ifs 를 사용하라고 말하는 모든 사람이 옳기 때문에 무시해서는 안됩니다 . 이것은 끔찍한 응용 프로그램입니다 switch.
— lincolnk

이 솔루션이 제공되지 않았다는 것을 믿을 수 없습니다. 이를 수행 할 수 있습니다. 문은 switch 절의 값으로 평가하기 만하면됩니다. 이 일 것입니다 그래서 :var liCount = 2; switch (liCount) { case 0: console.log(0); break; case (liCount<=5 && liCount>0) && liCount: console.log('liCount<=5 && liCount>0'); break; case (liCount<=10 && liCount>5) && liCount: console.log('liCount<=10 && liCount>5'); break; case (liCount>10) && liCount: console.log(liCount); break; }
— Noitidart

답변:


286

이것은 작동합니다 :

switch (true) {
    case liCount == 0:
        setLayoutState('start');
        var api = $('#UploadList').data('jsp');
        api.reinitialise();
        break;
    case liCount<=5 && liCount>0:
        setLayoutState('upload1Row');
        var api = $('#UploadList').data('jsp');
        api.reinitialise();
        break;
    case liCount<=10 && liCount>5:
        setLayoutState('upload2Rows');
        var api = $('#UploadList').data('jsp');
        api.reinitialise();
        break;
    case liCount>10:
        var api = $('#UploadList').data('jsp');
        api.reinitialise();
        break;                  
}

이 답변의 이전 버전은 괄호를 범인으로 간주했습니다. 사실 여기서 괄호는 관련이 없습니다. 필요한 것은 switch(true){...}케이스 표현식이 부울로 평가되는 것뿐입니다 .

이는 우리가 스위치에 제공 한 값이 비교 기준으로 사용되기 때문에 작동합니다. 결과적으로 부울로 평가되는 case 표현식은 실행되는 케이스를 결정합니다. 또한 이것을 switch(false){..}뒤집어 통과 하고 원하는 표현이 참 대신 거짓으로 평가되도록 할 수 있습니다 . 그러나 개인적으로 진실로 평가되는 조건을 다루는 것을 선호합니다. 그러나 그것은 또한 작동하므로 그것이 무엇을하고 있는지 이해하는 것을 명심할 가치가 있습니다.

예 : liCount가 3이면 첫 번째 비교는입니다 true === (liCount == 0). 이는 첫 번째 경우가 거짓임을 의미합니다. 그런 다음 스위치는 다음 케이스로 이동합니다 true === (liCount<=5 && liCount>0). 이 표현식은 true로 평가되어이 케이스가 실행되고 break. 더 명확하게하기 위해 여기에 괄호를 추가했지만 표현의 복잡성에 따라 선택 사항입니다.

긴 일련의 조건을 처리하는 매우 간단하고 깔끔한 방법 (사용자가 수행하려는 작업에 적합한 경우)입니다. 일련의 긴 조건 ìf() ... else if() ... else if () ...은 많은 시각적 소음이나 취약성을 유발할 수 있습니다.

유효한 코드 임에도 불구하고 비표준 패턴이므로주의해서 사용하십시오.


9
난 당신이 필요 거라고 생각 switch(true) {하고, case liCount == 0:권리를? 그렇지 않으면이 비교는 liCount == (liCount <=5 && liCount > 0)입니다.
— loganfsmyth

33
당신이 할 수 있기 때문에 당신 이 해야하는 것은 아닙니다 . 이것은 불로 죽일 필요가있는 것입니다.
— JBert 2014

21
그것은 언어의 일부입니다. 결과적으로 그것에 대해 아는 것이 그렇지 않은 것보다 낫습니다. 분명히 모든 상황에 적합하지는 않지만 순전히 주관적인 수준에서 이것은 흥미로운 접근 방식이며이 경우 일련의 ifs / elif보다 읽기 쉽고 덜 깨지기 쉽습니다. 기억해야 할 중요한 점은 코딩은 취향과 연습과 결합 된 의도의 표현이라는 것입니다. 코드에서 자신을 명확하게 표현할 수있는 더 많은 옵션을 갖는 것은 결코 나쁜 일이 아닙니다.
— dmp

1
나에게 이것은 매우 유용하고 if 조건을 기반으로 변수 이름을 반복해서 사용해야하는 논리를 구성하는 매우 좋은 방법 이었지만 n + 1 유형 시나리오 였으므로 switch 문이 중단은 아래의 다음 줄로 이동하는 것이 매우 유용했습니다.
— 조셉 Astrahan

2
스위치 표현과 같이 거짓이면 당신은 결과가되었을 것입니다 무슨 보는 우리의 눈을 뜨게 switch(false) { }
— hargbola 벨로

24

당신은 한 가지 방법은 그 overcomplicated. 대신 다음과 같이 if 문으로 작성하십시오.

if(liCount == 0)
    setLayoutState('start');
else if(liCount<=5)
    setLayoutState('upload1Row');
else if(liCount<=10)
    setLayoutState('upload2Rows');

$('#UploadList').data('jsp').reinitialise();

또는 ChaosPandion 이 최대한 최적화를 시도하는 경우 :

setLayoutState(liCount == 0 ? 'start' :
               liCount <= 5 ? 'upload1Row' :
               liCount <= 10 ? 'upload2Rows' :
               null);

$('#UploadList').data('jsp').reinitialise();

당신은 가서 한 명은 나에게 가야했습니다. :)
— ChaosPandion 2011 년

우리는 동시에 게시물을 작성했습니다. 내가 이미 게시하기 전까지는 당신의 것을 보지 못했습니다. 당신은 ... 지금 무리 것으로 나타났습니다
— 에릭

와, 지나치게 복잡한 조건문에 대해서는 생각하지 않았습니다.
— ChaosPandion 2011 년

1
@Chaos : 네, 아마도 그것을 과장하고있을 것입니다. null 검사를 추가해야합니다 setLayoutState. : P.
— 에릭

@Eric-내가 말한 것보다 더 많은 프로그래밍 랩을 가진 일부 프로그래머 : "중괄호없이 자바 스크립트를 작성할 수 있다는 점 (사실 조심해서 세미콜론)이 필요하다는 의미는 아닙니다."하지만 몇 가지를 다시 썼습니다. 어쨌든 귀하의 예제에서와 같이 if 문, 그래서 감사합니다-조건 다음에 실행할 행이 두 개 이상있을 때까지 잘 작동합니다. 삼항 솔루션은 너무 멀리 나를 위해 다리를했다하지만 ...
— 데이브 Everitt

7

if 문을 사용하려고합니다.

if (liCount === 0) {
    setLayoutState('start');
} else if (liCount <= 5) {
    setLayoutState('upload1Row');
} else if (liCount <= 10) {
    setLayoutState('upload2Rows');
}
$('#UploadList').data('jsp').reinitialise();  

7

아래 dmp의 답변을 참조하십시오 . 가능한 경우이 답변을 삭제했지만 수락되었으므로 이것이 차선책입니다 :)

당신은 할 수 없습니다. JS 인터프리터는 switch 문과 비교해야합니다 (예 : "case when"문이 없음). 정말로 이것을하고 싶다면 if(){ .. } else if(){ .. }블록을 만들 수 있습니다 .


9
틀 렸습니다. 다음은 작동을 보여주는 데모입니다 : jsfiddle.net/Ender/fr3wL . ECMAScript 표준은 이것이 허용됨을 명시 적으로 명시합니다 : docstore.mik.ua/orelly/webprog/jscript/ch06_05.htm#FOOTNOTE-18
— Ender

3
@Ender 헴 세가하려는 것과 어떻게 같은가요?
— Aistina

@Aistina 아니에요. 그의 케이스 조건은 숫자 값이 아닌 참 / 거짓 값을 생성하기 때문에, haemse는의 숫자 값에 대해 테스트하는 대신 진실한 값 (예 : danp의 답변에 의해 제 안됨)에 대해 케이스를 테스트해야했습니다 liCount. 나는 단지 "JS Interpreters가 case 서술문이 정적 값이어야한다"는 cwolves 원래 서술문이 틀렸다는 것을 지적한 것뿐입니다. cwolves는 이후이 진술을 수정했기 때문에 내 의견은 더 이상 관련이 없습니다.
— Ender

이것은 질문에 대한 답이 아니기 때문입니다. 그는 그것을 할 다른 방법을 요구하지 않았고, 그가 원하는대로 스위치 케이스가 작동하도록 요청했습니다. "다른 방법으로해라"는 우리가 거의 항상 그렇게 생각하고 있음에도 불구하고 거의 정답이 아닙니다. 우리는 항상 우리에게 더 나은 방법이 있다고 생각하지만 그가 원하는 방식이 아니기 때문에이 대답은 잘못된 것입니다.
— Jasmine

@Jasmine- "당신은 할 수 없습니다. 다른 방법으로하세요." 가 맞다면 완벽하게 유효 합니다 . 내 대답은 틀 렸기 때문에 아래로 투표되고 있습니다. :) @danp가 지적했듯이, 당신은 전환 할 수 있으며 true작동합니다. 근데 3 년이 넘었으니별로 신경 안 써.
— Mark Kahn

5
switch (true) {
  case condition0:
    ...
    break;
  case condition1:
    ...
    break;
}

조건이 적절한 boolean값을 반환하는 한 JavaScript에서 작동 하지만 else if명령문에 비해 많은 이점이 없습니다 .


10switch 문에서 정수를 전달하면 작동 합니까? 제 경우에는 그 이유가 무엇인지 잘 모르겠습니다.
— Pardeep Jain 19

10 !== true, 그래서 아니야. 값을 가질 수있는 변수가 10있습니까? 경우 x, 다음 case x === 10:작동합니다.
— Mike Samuel 19

그러나 예를 들어 if (10) {..}흐름 을 사용하는 경우 If조건을 통과해야하는 경우 다른 문처럼 작동 해야 합니다. 10 또는 0을 제외한 모든 정수는 진실 값으로 처리되어 조건에 들어갈 수 있기 때문입니다. 그가 여기에서 성명을 바꾸는 데 문제가 있는지 확실하지 않습니다.
— Pardeep Jain 19.06.26

1
@PardeepJain, switch단순히 if. if조건이 진실 인지 테스트합니다 . switch애프터 발현 여부를 시험 switch이다 ===( CaseClauseIsSelected 4 단계 이후 식의 값) case.
— Mike Samuel

오, 감사합니다. 이것은 나에게 완전히 새로운 것이었다. @ 마이크
— Pardeep 자이나교


4

그것이 당신이 원하는 일이라면, if문장 을 사용하는 것이 더 낫습니다 . 예를 들면 :

if(liCount == 0){
    setLayoutState('start');
}
if(liCount<=5 && liCount>0){
    setLayoutState('upload1Row');
}
if(liCount<=10 && liCount>5){
    setLayoutState('upload2Rows');
}             
var api = $('#UploadList').data('jsp');
    api.reinitialise();

2

코드가 예상 한 작업을 수행하지 않기 때문에 작동하지 않습니다. 스위치 블록은 값을 취하고 각 케이스를 주어진 값과 비교하여 동등성을 찾습니다. 비교 값은 정수이지만 대부분의 케이스 표현식은 부울 값으로 확인됩니다.

예를 들어 liCount = 2. 첫 번째 케이스는 일치하지 않습니다 2 != 0. 두 번째 사례는로 (liCount<=5 && liCount>0)평가 true되지만 이므로이 2 != true사례도 일치하지 않습니다.

이러한 이유로 다른 많은 사람들이 말했듯이 일련의 if...then...else if블록을 사용하여 이를 수행해야합니다.


2

가능한 값이 정수이면 케이스를 묶을 수 있습니다. 그렇지 않으면 ifs를 사용하십시오.

var api, tem;

switch(liCount){
    case 0:
    tem= 'start';
    break;
    case 1: case 2: case 3: case 4: case 5:
    tem= 'upload1Row';
    break;
    case 6: case 7: case 8: case 9: case 10:
    tem= 'upload2Rows';
    break;
    default:
    break;
}
if(tem) setLayoutState((tem);
api= $('#UploadList').data('jsp');
api.reinitialise();

0

스위치에 점수를 전달하지 않고 사실임을 주목하십시오. 우리가 스위치에주는 값은 비교할 기준으로 사용됩니다.

아래 예제는 if 문없이 case에 조건을 추가하는 방법을 보여줍니다.

function getGrade(score) {
    let grade;
    // Write your code here
    switch(true) {
        case score >= 0 && score <= 5:
        grade = 'F';
        break;
        case score > 5 && score <= 10:
        grade = 'E';
        break;
        case score > 10 && score <= 15:
        grade = 'D';
        break;
        case score > 15 && score <= 20:
        grade = 'C';
        break;
        case score > 20 && score <= 25:
        grade = 'B';
        break;
        case score > 25 && score <= 30:
        grade = 'A';
        break;
    }

    return grade;
}

0

OP 질문의 특정 예 switch에서는 적절하지 않지만 스위치가 여전히 적절 / 유익한 예가 있지만 다른 평가 식도 필요합니다. 이는 표현식에 대한 기본 절을 사용하여 수행 할 수 있습니다.

switch (foo) {
  case 'bar':
    // do something
    break;
  case 'foo':
    // do something
    break;
  ... // other plain comparison cases
  default:
    if (foo.length > 16) {
      // something specific
    } else if (foo.length < 2) {
      // maybe error
    } else {
      // default action for everything else
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.