OR(||)のように、スイッチの複数のケースをテストする


239

どのように使用することになりswitch case、あなたがのためにテストする必要がある場合Bと同じ場合には?

switch (pageid) {
  case "listing-page" || "home-page":
    alert("hello");
    break;
  case "details-page":
    alert("goodbye");
    break;
}

3
javascript switchステートメントでOR演算子使用することの重複の可能性-それは100%質問です;)
Felix Kling

カンマを使用している場合、各ケースで2つのオプションしか使用できないことがわかりました。
Agus Widiarsa

回答:


563

フォールスルーを使用できます。

switch (pageid)
{
    case "listing-page":
    case "home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}

69
これは「フォールスルー」と呼ばれます。
Felix Kling、2011年

2
質問を投稿する前にこれを見つけましたが、どこにも詳しく文書化されていないため、コミュニティにとって有用だと思いました...回答もありがとう@SLaks。
Andres

こんにちは@kei私はこれがこれに適切な場所ではないことを知っていますが、私の最後の質問に正しく回答しましたstackoverflow.com/questions/21049005/…回答を再投稿しますか?
Leon Gaban 2014年

1
要点を明確にしたほうがいいかもしれません。ケースが真と評価されたら、それだけです。これ以上のケースはチェックされず、最後まで実行されたすべてのステートメント、つまり「ブレーク」のみがチェックされます。命令またはスイッチが終了した場合。
BeauCielBleu 14


118

他の答えはそれが機能する理由を実際に説明せずにそれを行う方法を説明したので:

switch実行されると、最初に一致するcaseステートメントが見つかり、切り替え後のステートメントの各行がbreakステートメントまたはステートメントの最後switch(またはreturnステートメント全体を含むステートメント)に到達するまで実行されます。break次のコードcaseも実行されるように意図的に省略した場合は、「フォールスルー」と呼ばれます。OPの要件は次のとおりです。

switch (pageid) {
   case "listing-page":
   case "home-page":
      alert("hello");
      break;

   case "details-page":
      alert("goodbye");
      break;
} 

breakステートメントを含めることを忘れることはかなり一般的なコーディングの間違いであり、switch期待どおりに機能していない場合に最初に確認する必要があります。そのため、ブレークステートメントが意図的に省略されていることを明確にするために、「フォールスルー」とコメントを入れたい場合があります。次の例では、少し複雑で、フォールスルーする前に実行するコードを含めることができる場合があることを示しているので、これを行います。

switch (someVar) {
   case 1:
      someFunction();
      alert("It was 1");
      // fall through
   case 2:
      alert("The 2 case");
      // fall through
   case 3:
      // fall through
   case 4:
      // fall through
   case 5:
      alert("The 5 case");
      // fall through
   case 6:
      alert("The 6 case");
      break;

   case 7:
      alert("Something else");
      break;

   case 8:
      // fall through
   default:
      alert("The end");
      break;
}

(オプションで)defaultケースを含めることもできます。これは、他のケースが一致しない場合に実行されます-を含めず、default一致するケースがない場合は、何も起こりません。(オプションで)デフォルトのケースに進むことができます。

したがって、私の2番目の例でsomeVarは、1の場合に呼び出されsomeFunction()、複数のケースに該当する場合に4つのアラートが表示されます。であるsomeVarあなたが2回の警告を参照してくださいね3、4または5です。someVar7の場合は「何か他の値」が表示され、8またはその他の値の場合は「終わり」が表示されます。


4
// fall throughコメントは、私のphpstormにfall-through switchステートメントについての警告を表示させないようにします、ありがとう:)
Getz

switchが、オブジェクトを返すために呼び出す関数内にある場合、breakの代わりにreturnを使用できます。switch(action.type){case ADD:{return newState; }ケースDELETE:{return newState; }デフォルト:{状態を返す; }}
ドミニカ、

14

2つのcaseラベルを作成する必要があります。

コントロールは最初のラベルから2番目のラベルに移るので、どちらも同じコードを実行します。


9

あなたはそれを切り替える必要があります!

switch (true) {
    case ( (pageid === "listing-page") || (pageid === ("home-page") ):
        alert("hello");
        break;
    case (pageid === "details-page"):
        alert("goodbye");
        break;
}

1
この方法は非常に革新的です:-)私はそれが好きです。ただし、クラシックな「フォールスルー」よりも多くの文字を使用するため、面白さが少なくなります:)
AlexLaforge

1
@AlexLaforgeは、別のstackouverflowの質問でそのような答えが完全に反対票を投じられた最も奇妙で皮肉なものです。しかし、それでも私はこの答えを支持し、同意します。それは柔軟な条件に対する良い解決策です。
AlexNikonov

3

忘れswitchbreak、で遊んでみましょうif。そして主張する代わりに

if(pageid === "listing-page" || pageid === "home-page")

ケース付きのいくつかの配列を作成し、それをArray.prototype.includes()で確認します

var caseA = ["listing-page", "home-page"];
var caseB = ["details-page", "case04", "case05"];

if(caseA.includes(pageid)) {
    alert("hello");
}
else if (caseB.includes(pageid)) {
    alert("goodbye");
}
else {
    alert("there is no else case");
}

-6

大文字と小文字を区切るにはカンマを使用します

switch (pageid)
{
    case "listing-page","home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.