Bir anahtardaki OR (||) gibi birden fazla örneği test edin


239

Aynı durumda a veya b'yiswitch case test etmeniz gerektiğinde a'yı nasıl kullanırsınız ?

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


Virgül kullanarak her durumda izin verilen 2 seçenek buldum.
Agus Widiarsa Yaptım

Yanıtlar:


563

Düşüşü kullanabilirsiniz:

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

69
Buna düşme denir .
Felix Kling

2
Soruyu yayınlamadan önce bunu öğrendim, ancak herhangi bir yerde iyi belgelenmediği için topluluk için yararlı olacağını düşündüm ... Siz de cevabınız için teşekkür ederiz @SLaks.
Andres

Merhaba @kei Bunun için uygun bir yer olmadığını biliyorum, ama son sorum doğru cevap verdiniz stackoverflow.com/questions/21049005/… Cevabınızı yeniden göndermek ister misiniz?
Leon Gaban

1
Konuyu açıklığa kavuşturabilirim: Bir dava bir kez doğru olarak değerlendirildiğinde, hepsi bu. Başka vaka kontrol edilmez, yalnızca sonuna kadar yürütülen tüm ifadeler: yani bir "break;" veya anahtarın sonlandırılıp bırakılmadığını kontrol edin.
BeauCielBleu


118

Diğer cevaplar, aslında neden çalıştığını açıklamadan nasıl yapılacağını açıkladığından:

Zaman switchyürütür, ilk uygun bulduğu caseaçıklama ve daha sonra bir ya da isabet kadar geçişten sonra, her kod satır yürütür breakdeyimi veya sonuna switch(ya da bir returnbütün içeren fonksiyonu bırakmak deyimi). Kasıtlı olarak break, bir sonraki kodun altındaki kod caseda düşme olarak adlandırılır . OP'nin gereksinimi için:

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

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

breakİfadeleri dahil etmeyi unutmak oldukça yaygın bir kodlama hatasıdır ve switchbeklediğiniz şekilde çalışmıyorsa aramanız gereken ilk şeydir . Bu nedenle bazı insanlar, ara bildirimleri bilerek çıkarıldığında bunu açıklığa kavuşturmak için “düşmek” demek için yorum yapmaktan hoşlanırlar. Biraz daha karmaşık ve bazı durumlarda onlar düşmeden önce yürütmek için kod içerebileceğini gösterir aşağıdaki örnekte bunu:

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;
}

Ayrıca (isteğe bağlı olarak) defaultdiğer vakalardan hiçbiri eşleşmezse yürütülecek bir vaka da ekleyebilirsiniz - eğer bir defaultvaka eklemezseniz ve hiçbir vaka eşleşmezse hiçbir şey olmaz. (İsteğe bağlı olarak) varsayılan duruma geçebilirsiniz.

Yani benim ikinci örneğim someVar1 ise , arayacaktı someFunction()ve daha sonra, bazılarının altında uyarıları olan birden fazla durumda düştüğü için dört uyarı göreceksiniz. Mi someVar3, 4 veya 5 İki uyarıları görürdük olduğunu. Eğer someVar7 Eğer "Başka bir şey" görürdünüz ve 8 ise ya da başka herhangi bir değer "sonunu" yazdığını görür.


4
// sonbahar boyunca yorum benim phpstorm düşme geçiş beyanı hakkında beni uyarmak durdurmak yapmak, teşekkürler :)
Getz

Sen kullanabilirsiniz dönüşü yerine aradan şalterini (action.type) {case ADD: anahtar bir fonksiyonu ise bazı nesne dönmek dediğimiz {NewState return; } case DELETE: {return newState; } varsayılan: {dönüş durumu; }}
Dominika

14

İki caseetiket yapmanız gerekiyor .

Kontrol ilk etiketten ikinciye geçer, böylece ikisi de aynı kodu yürütür.


9

Değiştirmelisin!

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

1
Bu yöntem çok yenilikçi :-) Bunun için seviyorum. Ancak, klasik "düşme" den daha fazla karakter kullandığından, daha az ilginç hale gelir :)
AlexLaforge

1
@AlexLaforge başka bir yığın akış soruda böyle bir cevabın tamamen reddedildiği en tuhaf ve ironik. Ama yine de bu yanıtı destekliyorum ve katılıyorum, bu esnek koşullar için iyi bir çözüm.
AlexNikonov

3

Unut switchve break, ile oynayalım if. Ve iddia etmek yerine

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

vakalarla birkaç dizi oluşturalım ve Array.prototype.includes () ile kontrol edelim

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

Büyük / küçük harf ayırmak için virgül kullanın

switch (pageid)
{
    case "listing-page","home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.