ทดสอบหลายกรณีในสวิตช์เช่น OR (||)


239

คุณจะใช้ a switch caseเมื่อคุณต้องการทดสอบa หรือ b อย่างไรในกรณีเดียวกันได้อย่างไร

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


ฉันพบว่าใช้เครื่องหมายจุลภาคเพียง 2 ตัวเลือกที่อนุญาตในแต่ละกรณี
Agus Widiarsa ฉันทำ

คำตอบ:


563

คุณสามารถใช้ fall-through:

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

69
มันเรียกว่าฤดูใบไม้ร่วงผ่าน
เฟลิกซ์คลิง

2
ฉันพบสิ่งนี้ก่อนที่ฉันจะโพสต์คำถาม แต่คิดว่ามันจะมีประโยชน์สำหรับชุมชนเนื่องจากไม่ได้มีการบันทึกไว้ที่ใดเลย ... ขอบคุณ @SLaks สำหรับคำตอบของคุณเช่นกัน
Andres

สวัสดี @kei ฉันรู้ว่านี่ไม่ใช่สถานที่ที่เหมาะสมสำหรับเรื่องนี้ แต่คุณตอบคำถามสุดท้ายของฉันได้อย่างถูกต้องstackoverflow.com/questions/21049005/…คุณต้องการ repost คำตอบของคุณหรือไม่
Leon Gaban

1
ฉันอาจจะอธิบายให้ชัดเจนเช่นกัน: เมื่อกรณีหนึ่งได้รับการประเมินว่าเป็นจริง ไม่มีการตรวจสอบกรณีอื่น ๆ เพียงแค่ข้อความทั้งหมดที่ดำเนินการจนสิ้นสุด: เช่น "break;" คำสั่งหรือถ้าสวิตช์ถูกยกเลิก
BeauCielBleu

ตัวอย่างอื่น ๆที่นี่ในเอกสาร MDN
Luca Reghellin

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ไม่ได้ทำงานตามที่คาดไว้ ด้วยเหตุผลดังกล่าวบางคนชอบที่จะใส่ความคิดเห็นเพื่อพูดว่า "ผ่าน" เพื่อให้ชัดเจนเมื่อมีการละเว้นการใช้คำสั่ง break ในวัตถุประสงค์ ฉันทำอย่างนั้นในตัวอย่างต่อไปนี้เนื่องจากมันมีความซับซ้อนมากขึ้นและแสดงให้เห็นว่าบางกรณีสามารถรวมรหัสเพื่อเรียกใช้ก่อนที่จะล้มลงได้อย่างไร:

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กรณีและปัญหาซึ่งจะถูกดำเนินการหากไม่มีกรณีอื่น ๆ ที่ตรงกับ - หากคุณไม่รวม a defaultและไม่มีกรณีที่ตรงกันแล้วไม่มีอะไรเกิดขึ้น คุณสามารถเลือกที่จะใช้ตัวพิมพ์เล็ก (ตัวเลือก)

ดังนั้นในตัวอย่างที่สองของฉันถ้าsomeVarเป็น 1 มันจะโทรsomeFunction()แล้วคุณจะเห็นการแจ้งเตือนสี่รายการเนื่องจากมีหลายกรณีที่บางรายการมีการแจ้งเตือนอยู่ คือsomeVar3, 4 หรือ 5 คุณจะเห็นการแจ้งเตือนสองรายการ ถ้าsomeVarเป็น 7 คุณจะเห็น "อย่างอื่น" และถ้าเป็น 8 หรือค่าอื่น ๆ ที่คุณเห็น "จุดสิ้นสุด"


4
// ร่วงผ่านความคิดเห็นทำให้ phpstorm ของฉันหยุดเตือนฉันเกี่ยวกับคำสั่งเปลี่ยนผ่านล้มเหลวขอบคุณ :)
Getz

คุณสามารถใช้returnแทนbreakถ้าสวิตช์อยู่ในฟังก์ชันที่คุณเรียกใช้เพื่อคืนค่า object: switch (action.type) {case ADD: {return newState; } case DELETE: {return newState; } default: {return state; }}
Dominika

14

คุณต้องทำสองอย่าง caseป้ายกำกับ

การควบคุมจะตกหลุมจากเลเบลแรกไปที่สองดังนั้นทั้งคู่จะรันโค้ดเดียวกัน


9

คุณต้องเปลี่ยนมัน!

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

1
วิธีนี้เป็นนวัตกรรมที่ยอดเยี่ยมมาก :-) ฉันชอบมันมาก แต่ที่จะใช้ตัวอักษรมากกว่าคลาสสิก "ฤดูใบไม้ร่วงผ่าน" มันจะกลายเป็นที่น่าสนใจน้อย :)
AlexLaforge

1
@ AlexLaforge ที่แปลกและแดกดันมากที่สุดในอีกกรณีหนึ่งที่ซ้อนทับกัน แต่อย่างไรก็ตามฉันสนับสนุนคำตอบนี้และยอมรับว่าเป็นทางออกที่ดีสำหรับเงื่อนไขที่ยืดหยุ่น
AlexNikonov

3

ลืมswitchและช่วยให้การเล่นด้วยbreak 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.