113

そのばかげた質問でごめんなさい。javascript switch-case language要素で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

13 に答える 13

353

これは機能します:

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){...}、ケース式がブール値に評価されることだけです。

これは、スイッチに与える値が比較の基準として使用されるために機能します。したがって、ケース式は、ブール値を評価して、実行されるケースを決定します。また、これを好転switch(false){..}させて、目的の式をtrueではなくfalseと評価させることもできますが、個人的には、真実性と評価される条件を処理することを好みます。ただし、それも機能するので、それが何をしているのかを理解することを覚えておく価値があります。

例:liCountが3の場合、最初の比較はですtrue === (liCount == 0)。これは、最初のケースがfalseであることを意味します。次に、スイッチは次のケースに進みtrue === (liCount<=5 && liCount>0)ます。この式はtrueと評価されます。つまり、このケースが実行され、で終了しますbreak。わかりやすくするためにここに括弧を追加しましたが、式の複雑さに応じてオプションです。

それは非常に単純で、長い一連の条件を処理するためのきちんとした方法(あなたがやろうとしていることに合う場合)であり、おそらく長い一連の条件はìf() ... else if() ... else if () ...多くの視覚的なノイズや脆弱性をもたらす可能性があります。

有効なコードであるにもかかわらず、非標準のパターンであるため、注意して使用してください。

于 2012-01-29T18:29:09.107 に答える
29

あなたはそれを過度に複雑にしました。代わりに次のように 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();
于 2011-03-28T20:05:20.670 に答える
9

ifステートメントを使用したい:

if (liCount === 0) {
    setLayoutState('start');
} else if (liCount <= 5) {
    setLayoutState('upload1Row');
} else if (liCount <= 10) {
    setLayoutState('upload2Rows');
}
$('#UploadList').data('jsp').reinitialise();  
于 2011-03-28T20:01:28.633 に答える
8

以下のdmpの回答を参照してください。できればこの回答を削除しますが、受け入れられたので、これが次善の策です:)

できません。JS インタープリターでは、switch ステートメントと比較する必要があります (たとえば、「case when」ステートメントはありません)。本当にこれをやりたい場合は、if(){ .. } else if(){ .. }ブロックを作成するだけです。

于 2011-03-28T20:00:31.470 に答える
6
switch (true) {
  case condition0:
    ...
    break;
  case condition1:
    ...
    break;
}

条件が適切な値を返す限り、JavaScript で機能しますが、ステートメントbooleanよりも多くの利点はありません。else if

于 2012-01-29T18:30:20.610 に答える
5

switch ケースでは、フォールスルー方式を使用できます。

const x = 'Welcome';

switch (x) {
  case 'Come':
    console.log(1)
    break;

  case 'Welcome':
  case 'Wel':
  case 'come':
    console.log(2)
    break;

  case 'Wel':
    console.log(3)
    break;

  default:
    break;
}

    
> Result => 2
于 2020-12-31T04:17:51.720 に答える
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();
于 2011-03-28T20:01:24.733 に答える
4

ifこれは、句を使用する必要がある場合です。

于 2011-03-28T20:00:07.260 に答える
3

可能な値が整数の場合、ケースをまとめることができます。それ以外の場合は、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();
于 2011-03-28T20:37:53.453 に答える
2

期待どおりの動作をしていないため、コードが機能しません。Switch ブロックは値を受け取り、各ケースを指定された値と比較して等しいかどうかを調べます。比較値は整数ですが、ケース式のほとんどはブール値に解決されます。

たとえばliCount = 2、最初のケースは一致しません2 != 0。2 番目のケースは, butと(liCount<=5 && liCount>0)評価されるため、このケースも一致しません。true2 != true

このため、他の多くの人が言っているように、if...then...else ifこれを行うには一連のブロックを使用する必要があります。

于 2011-03-28T20:09:15.090 に答える