web-dev-qa-db-ja.com

JavaScriptで整数の範囲をオンにします

このようなことをしたい

    switch (this.dealer) {
        case 1-4: 
            // Do something.
            break;
        case 5-8: 
            // Do something.
            break;
        case 9-11: 
            // Do something.
            break;
        default:
            break;
    }

これに適した構文は何ですか? JavaScriptで可能ですか?

this.dealerは整数であり、それらの値の間にある場合は、何かをします。

118
Jaanus

ここに私がそれを理解した別の方法があります:

const x = this.dealer;
switch (true) {
    case (x < 5):
        alert("less than five");
        break;
    case (x < 9):
        alert("between 5 and 8");
        break;
    case (x < 12):
        alert("between 9 and 11");
        break;
    default:
        alert("none");
        break;
}
252

クリーンにするためにMarvinLabsによる回答を増やします。

var x = this.dealer;
switch (true) {
    case (x < 5):
        alert("less than five");
        break;
    case (x < 9):
        alert("between 5 and 8");
        break;
    case (x < 12):
        alert("between 9 and 11");
        break;
    default:
        alert("none");
        break;
}

breakステートメントは実行により残りのケースをスキップするため、範囲の下限をチェックする必要はありません。 (x <9)値は5以上でなければなりません。

もちろん、ケースが元の順序のままである場合にのみ出力が正しく、(質問に記載されているように)整数値を想定します-技術的には、範囲は5と8.999999999999の間です。ポイント番号。

ケースを移動したり、各ケースステートメントで全範囲を表示できるように読みやすくしたい場合は、各ケースの下限範囲に以下のチェックを追加します。

var x = this.dealer;
switch (true) {
    case (x < 5):
        alert("less than five");
        break;
    case (x >= 5 && x < 9):
        alert("between 5 and 8");
        break;
    case (x >= 9 && x < 12):
        alert("between 9 and 11");
        break;
    default:
        alert("none");
        break;
}

これは人為的ミスの余分なポイントを追加することに注意してください-誰かが範囲を更新しようとしますが、両方の場所でそれを変更することを忘れて、カバーされない重複またはギャップを残します。例えばここで、8の場合は、以前は8に一致していたケースを編集しただけでは何にも一致しません。

    case (x >= 5 && x < 8):
        alert("between 5 and 7");
        break;
    case (x >= 9 && x < 12):
        alert("between 9 and 11");
        break;
42
David Mason
    switch(this.dealer) {
        case 1:
        case 2:
        case 3:
        case 4:
            // Do something.
            break;
        case 5:
        case 6:
        case 7:
        case 8:
            // Do something.
            break;
        default:
            break;
    }

一連のケースが気に入らない場合は、単にif/else if/elseステートメントを探してください。

20

これはswitchステートメントを必要としません。それはずっとより明確、もっと簡潔、そしてfasterif elseステートメントを使用する...

var d = this.dealer;
if (1 <= d && d <= 11) { // making sure in range 1..11
    if (d <= 4) {
        alert("1 to 4");
    } else if (d <= 8) {
        alert("5 to 8");
    } else {
        alert("9 to 11");
    }
} else {
    alert("not in range");
}

速度テスト

単純なif ... else ...の代わりにスイッチを使用するオーバーヘッドについて興味があったので、jsFiddleをまとめて調べます... http://jsfiddle.net/17x9w1eL/

  • Chrome:switchif elseよりも約70%遅くなりました

  • Firefox:switchif elseよりも約5%遅い

  • IE:switchif elseよりも約5%遅い

  • Safari:switchif elseよりも約95%遅い

注:

特にコードが後で自動的に最適化される場合は、ローカル変数への割り当てはオプションです。

数値範囲の場合、この種の構成を使用します...

if (1 <= d && d <= 11) {...}

...私にとっては、数学で範囲を表現する方法に近いように読み取るため(1 <= d <= 11)、コードを読んでいるときに、「dが1と11 "。

クリアラー

少数の人々は、これがより明確だとは思わないとコメントしています。構造はスイッチオプションとほぼ同じであるため、確かにそれほど明確ではありません。それがより明確である主な理由は、そのすべての部分が読み取り可能であり、単純な直感的な意味をなすのに対し、「switch(true)」はかなり無意味な行であるということですコードの。スクリプトでそれを読んでいる多くのコーダーは、「WTFはどういう意味ですか?」そしてそれを調べなければなりません。それは汚いハックであり、直感的ではなく、明確でもありません。それがあなたがコーディングしたい方法であり、他の誰もあなたのコードベースを扱う必要がないなら、それのために行ってください。そうでなければ、意図されているもののために構造を使用する方が良いです。

15
xtempore

チェック範囲が必要な場合は、次のようにifおよびelse ifステートメントを使用することをお勧めします。

if (range > 0 && range < 5)
{
    // ..
}
else if (range > 5 && range < 9)
{
    // ..
}
else
{
    // Fall through
}

スイッチは、より大きな範囲で大きくなる可能性があります。

3
Kevin

いいえ、これは不可能です。最も近いものは次のとおりです。

  switch(this.dealer) {
    case 1:
    case 2:
    case 3:
    case 4:
                      // DO SOMETHING
        break;
    case 5:
    case 6:
    case 7:
    case 8:
                      // DO SOMETHING
       break;

しかし、これは非常に扱いにくいです。

このような場合、通常はif/else if構造体を使用することをお勧めします。

1
RoToRa
function sequentialSizes(val) {
 var answer = "";

 switch (val){
case 1:
case 2:
case 3:
case 4:
  answer="Less than five";
  break;
case 5:
case 6:
case 7:
case 8:
  answer="less than 9";
  break;
case 8:
case 10:
case 11:
  answer="More than 10";
  break;
 }

return answer;  
}

// Change this value to test you code to confirm ;)
sequentialSizes(1);
0
Shalto

高速で効率的で読みやすいものを実行しようとしている場合は、次のような標準のif ... then ... else構造を使用します。

var d = this.dealer;
if (d < 12) {
    if (d < 5) {
        alert("less than five");
    }else if (d < 9) {
        alert("between 5 and 8");
    }else{
        alert("between 9 and 11");
    }
}else{
    alert("none");
}

難読化し、ひどい(しかし小さい)にしたい場合は、これを試してください:

var d=this.dealer;d<12?(d<5?alert("less than five"):d<9?alert("between 5 and 8"):alert("between 9 and 11")):alert("none");

ところで、上記のコードはJavaScript if ... then ... else速記文です。難読化またはコードの縮小が目標でない限り、コードを記述しない方法の良い例です。この方法で記述した場合、コードのメンテナンスが問題になる可能性があることに注意してください。簡単に読める人はほとんどいません。ただし、コードサイズは、パフォーマンスを損なうことなく標準の場合よりも50%小さくなります。つまり、大規模なコードベースでは、このような縮小化により、帯域幅が制限されたネットワークや高遅延ネットワークでのコード配信を大幅に高速化できます。

ただし、これは良い答えとは見なされません。これはできることの単なる例であり、すべきことではありません。

0
John Pace

3進数のより読みやすいバージョンは次のようになります。

var x = this.dealer;
alert(t < 1 || t > 11
  ? 'none'
    : t < 5
  ? 'less than five'
    : t <= 8
  ? 'between 5 and 8'
  : 'Between 9 and 11');
0
Brook Jordan