web-dev-qa-db-ja.com

2つの変数でcase / switchステートメントを使用できますか?

JavaScriptに関しては初心者であり、1つのSWITCH/CASEステートメントを使用するほうが、IFステートメントの束よりも速いことを理解していました。

ただし、2つの変数を持つSWITCH/CASEステートメントを使用します。

私のWebアプリには2つのスライダーがあり、それぞれに5つの状態があります。これら2つの変数の状態に基づいて動作をしたいです。明らかに、これは多くのIF/THENステートメントの全体です。

私がそれを行うことを考えた1つの方法は、2つの変数を1つに連結してから、それを切り替え/ケースにすることでした。

2つの変数を使用してSWITCH/CASEを達成するより良い方法はありますか?

ありがとう!

23
user918967

ビットごとの演算子はどうですか?文字列ではなく、「エレガント」に見える「enums」を扱っています。

// Declare slider's state "enum"
var SliderOne = {
    A: 1,
    B: 2,
    C: 4,
    D: 8,
    E: 16
};

var SliderTwo = {
    A: 32,
    B: 64,
    C: 128,
    D: 256,
    E: 512
};

// Set state
var s1 = SliderOne.A,
    s2 = SliderTwo.B;

// Switch state
switch (s1 | s2) {
    case SliderOne.A | SliderTwo.A :
    case SliderOne.A | SliderTwo.C :
        // Logic when State #1 is A, and State #2 is either A or C
        break;
    case SliderOne.B | SliderTwo.C :
        // Logic when State #1 is B, and State #2 is C
        break;
    case SliderOne.E | SliderTwo.E :
    default:
        // Logic when State #1 is E, and State #2 is E or
        // none of above match
        break;


}

しかし、私は他の人に同意します。スイッチケースロジックの25のケースはあまりきれいではありません。とにかく。

20
DashK
var var1 = "something";
var var2 = "something_else";
switch(var1 + "|" + var2) {
    case "something|something_else":
        ...
        break;
    case "something|...":
        break;
    case "...|...":
        break;
}

それぞれに5つの可能性がある場合、25のケースがあります。

18
Halcyon

まず、 JavaScriptのswitchif/else(そして時にはもっと遅い)

第二に、複数の変数でswitchを使用する唯一の方法は、それらを1つのプリミティブ(文字列、数値など)値に結合することです。

var stateA = "foo";
var stateB = "bar";
switch (stateA + "-" + stateB) {
    case "foo-bar": ...
    ...
}

しかし、個人的には、if/elseステートメントのセットが必要です。

Edit:すべての値が整数の場合、スイッチはChromeでif/elseを上回ることができるようです。コメントを参照してください。

9
David Wolever

スイッチ/ケースが一連のif/elseifよりも高速であるとは思わない。それらは同じことをしますが、if/elseifは複数の変数をチェックできます。複数の値でスイッチ/ケースを使用することはできません。

4
Ryan P

各スライダーの各位置に1〜1000000000の異なるバイナリ値を指定して、合計を処理できます。

3
TecBrat

各組み合わせのアクションが静的な場合、2次元配列を作成できます。

var data = [
  [1,2,3,4,5],
  [6,7,8,9,10],
  [11,12,13,14,15],
  [16,17,18,19,20],
  [21,22,23,24,25]
];

上記の例の数値は、文字列、配列など、何でもかまいません。値の取得は、1行になりました(スライダーの値の範囲は[0,5であると仮定])。

var info = data[firstSliderValue][secondSliderValue];
3
Ja͢ck

はい、次のこともできます。

    switch (true) {

     case (var1 === true && var2 === true) :
       //do something
       break;
     case (var1 === false && var2 === false) :
       //do something
       break;

      default:

    }

これは常にif/elseのようにスイッチを実行しますが、きれいに見えます。ケース式の変数のチェックを続けます。

1
aabiro

ええ、しかし普通ではありません。スイッチをクロージャーとして使用する必要があります。

例:-

function test(input1, input2) {
     switch (true) {
        case input1 > input2:
                    console.log(input1 + " is larger than " + input2);
                    break;
        case input1 < input2:
                    console.log(input2 + " is larger than " + input1);
        default:
                    console.log(input1 + " is equal to " + input2);
      }
   }
1
Parul