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


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.