Uji beberapa kasus dalam sebuah saklar, seperti OR (||)

239

Bagaimana Anda menggunakan a switch caseketika Anda perlu menguji a atau b dalam kasus yang sama?

switch (pageid) {
  case "listing-page" || "home-page":
    alert("hello");
    break;
  case "details-page":
    alert("goodbye");
    break;
}
Andres
sumber
3
kemungkinan duplikat menggunakan operator ATAU dalam pernyataan beralih javascript - ini 100% pertanyaan Anda;)
Felix Kling
Saya menemukan menggunakan koma hanya 2 opsi yang diizinkan setiap kasus.
Agus Widiarsa I Dibuat

Jawaban:

563

Anda dapat menggunakan fall-through:

switch (pageid)
{
    case "listing-page":
    case "home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}
kei
sumber
69
Ini disebut fall-through .
Felix Kling
2
Saya menemukan ini sebelum saya memposting pertanyaan, tetapi saya pikir ini akan bermanfaat bagi masyarakat karena tidak terdokumentasi dengan baik di mana pun ... terima kasih @SLaks untuk jawaban Anda juga.
Andres
Hai @ kei Saya tahu ini bukan tempat yang tepat untuk ini, tetapi Anda menjawab pertanyaan terakhir saya dengan benar stackoverflow.com/questions/21049005/... Anda ingin memposting ulang jawaban Anda?
Leon Gaban
1
Saya mungkin juga menjelaskan poinnya: Setelah sebuah kasus dievaluasi menjadi benar, itu saja. Tidak ada lagi kasus yang diperiksa, hanya semua pernyataan dieksekusi sampai akhir: yaitu "istirahat;" instruksi atau jika saklar diakhiri.
BeauCielBleu
contoh lain di sini dalam dokumen MDN
Luca Reghellin
118

Karena jawaban yang lain menjelaskan cara melakukannya tanpa benar-benar menjelaskan mengapa itu bekerja:

Ketika switchdijalankan, ia menemukan casepernyataan yang cocok pertama dan kemudian mengeksekusi setiap baris kode setelah beralih sampai menyentuh breakpernyataan atau akhir dari switch(atau returnpernyataan untuk meninggalkan seluruh fungsi yang mengandung). Ketika Anda dengan sengaja menghilangkan breakkode sehingga di bawah berikutnya casedieksekusi juga itu disebut fall-through . Jadi untuk persyaratan OP:

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

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

Lupa untuk memasukkan breakpernyataan adalah kesalahan pengkodean yang cukup umum dan merupakan hal pertama yang harus Anda cari jika Anda switchtidak bekerja seperti yang Anda harapkan. Untuk alasan itu beberapa orang suka memberikan komentar untuk mengatakan "gagal" untuk memperjelas kapan pernyataan break dihilangkan dengan sengaja. Saya melakukannya dalam contoh berikut karena ini sedikit lebih rumit dan menunjukkan bagaimana beberapa kasus dapat menyertakan kode untuk dieksekusi sebelum mereka gagal:

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

Anda juga dapat (secara opsional) memasukkan sebuah defaultcase, yang akan dieksekusi jika tidak ada case yang cocok - jika Anda tidak menyertakan a defaultdan tidak ada case yang cocok maka tidak ada yang terjadi. Anda dapat (secara opsional) masuk ke case default.

Jadi, dalam contoh kedua saya jika someVar1 akan memanggil someFunction()dan kemudian Anda akan melihat empat peringatan karena jatuh melalui beberapa kasus beberapa di antaranya memiliki peringatan di bawah mereka. Apakah someVar3, 4 atau 5 Anda akan melihat dua peringatan. Jika someVaradalah 7 Anda akan melihat "Sesuatu yang lain" dan jika itu adalah 8 atau nilai lain Anda akan melihat "Akhir".

nnnnnn
sumber
4
Komentar // fall through membuat phpstorm saya berhenti memperingatkan saya tentang pernyataan switch fall-through, terima kasih :)
Getz
Anda dapat menggunakan return sebagai ganti break jika switch dalam fungsi yang Anda panggil untuk mengembalikan beberapa objek: switch (action.type) {case ADD: {return newState; } case DELETE: {return newState; } default: {return state; }}
Dominika
14

Anda perlu membuat dua caselabel.

Kontrol akan jatuh dari label pertama ke yang kedua, sehingga mereka berdua akan menjalankan kode yang sama.

Slaks
sumber
9

Anda harus mengubahnya!

switch (true) {
    case ( (pageid === "listing-page") || (pageid === ("home-page") ):
        alert("hello");
        break;
    case (pageid === "details-page"):
        alert("goodbye");
        break;
}
Stefano Favero
sumber
1
Metode ini sangat inovatif :-) Saya suka untuk itu. Tapi, karena menggunakan lebih banyak karakter daripada "fall-through" klasik, itu menjadi kurang menarik :)
AlexLaforge
1
@AlexLaforge yang paling aneh dan ironis bahwa dalam pertanyaan stackouverflow jawaban lain benar-benar diturunkan. Namun demikian saya mendukung jawaban ini dan setuju, itu solusi yang bagus untuk kondisi yang fleksibel.
AlexNikonov
3

Lupakan switchdan break, mari bermain dengan if. Dan bukannya menegaskan

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

mari kita buat beberapa array dengan case dan periksa dengan 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");
}
khex
sumber
-6

Gunakan koma untuk memisahkan kasing

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