Kiểm tra nhiều trường hợp trong một công tắc, như OR (||)


239

Làm thế nào bạn sẽ sử dụng một switch casekhi bạn cần kiểm tra a hoặc b trong cùng một trường hợp?

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

3
có thể trùng lặp với việc sử dụng toán tử OR trong câu lệnh chuyển đổi javascript - đó là 100% câu hỏi của bạn;)
Felix Kling

Tôi tìm thấy bằng cách sử dụng dấu phẩy chỉ có 2 tùy chọn cho phép mỗi trường hợp.
Agus Widiarsa tôi thực hiện

Câu trả lời:


563

Bạn có thể sử dụng thông qua:

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

69
Nó được gọi là rơi .
Felix Kling

2
Tôi đã phát hiện ra điều này trước khi tôi đăng câu hỏi, nhưng nghĩ rằng nó sẽ hữu ích cho cộng đồng vì nó không được ghi chép tốt ở bất cứ đâu ... cảm ơn bạn @SLaks vì bạn cũng đã trả lời.
Andres

Xin chào @kei Tôi biết đây không phải là nơi thích hợp cho việc này, nhưng bạn đã trả lời đúng câu hỏi cuối cùng của tôi stackoverflow.com/questions/21049005/, bạn có muốn đăng lại câu trả lời của mình không?
Leon Gaban

1
Tôi cũng có thể làm rõ vấn đề: Một khi một trường hợp đã được đánh giá là đúng, thì đó là điều đó. Không có thêm trường hợp nào được kiểm tra, chỉ có tất cả các câu lệnh được thực thi cho đến khi kết thúc: tức là "break;" hướng dẫn hoặc nếu chuyển đổi được chấm dứt.
BeauCielBleu


118

Vì các câu trả lời khác giải thích cách thực hiện mà không thực sự giải thích lý do tại sao nó hoạt động:

Khi switchthực thi, nó tìm thấy casecâu lệnh khớp đầu tiên và sau đó thực thi từng dòng mã sau khi chuyển đổi cho đến khi nó chạm một breakcâu lệnh hoặc kết thúc switch(hoặc một returncâu lệnh rời khỏi toàn bộ hàm chứa). Khi bạn cố tình bỏ qua breakđể mã bên dưới caseđược thực thi, đó được gọi là thông qua . Vì vậy, đối với yêu cầu của OP:

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

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

Quên bao gồm các breakcâu lệnh là một lỗi mã hóa khá phổ biến và là điều đầu tiên bạn nên tìm kiếm nếu bạn switchkhông làm việc theo cách bạn mong đợi. Vì lý do đó, một số người thích đưa ra một nhận xét để nói "rơi vào" để làm cho nó rõ ràng khi các tuyên bố phá vỡ đã được bỏ qua trên mục đích. Tôi làm điều đó trong ví dụ sau vì nó phức tạp hơn một chút và chỉ ra cách một số trường hợp có thể bao gồm mã để thực thi trước khi chúng rơi vào:

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

Bạn cũng có thể (tùy chọn) bao gồm một defaulttrường hợp, sẽ được thực hiện nếu không có trường hợp nào khác khớp - nếu bạn không bao gồm một defaultvà không có trường hợp nào khớp thì không có gì xảy ra. Bạn có thể (tùy chọn) rơi vào trường hợp mặc định.

Vì vậy, trong ví dụ thứ hai của tôi nếu someVarlà 1 thì nó sẽ gọi someFunction()và sau đó bạn sẽ thấy bốn cảnh báo khi nó rơi vào nhiều trường hợp một số trong đó có cảnh báo theo chúng. Là someVar3, 4 hoặc 5 bạn sẽ thấy hai cảnh báo. Nếu someVarlà 7 bạn sẽ thấy "Cái gì khác" và nếu là 8 hoặc bất kỳ giá trị nào khác bạn sẽ thấy "Kết thúc".


4
// thông qua nhận xét làm cho phpstorm của tôi dừng cảnh báo tôi về tuyên bố chuyển đổi rơi, cảm ơn :)
Getz

Bạn có thể sử dụng return thay vì break nếu switch nằm trong hàm mà bạn gọi để trả về một số đối tượng: switch (action.type) {case ADD: {return newState; } trường hợp XÓA: {return newState; } mặc định: {trạng thái trả về; }}
Dominika

14

Bạn cần làm hai casenhãn.

Kiểm soát sẽ chuyển từ nhãn thứ nhất sang nhãn thứ hai, vì vậy cả hai sẽ thực thi cùng một mã.


9

Bạn phải chuyển nó!

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

1
Phương pháp này rất sáng tạo :-) Tôi thích nó vì điều đó. Nhưng, vì nó sử dụng nhiều ký tự hơn "rơi" cổ điển, nó trở nên ít thú vị hơn :)
AlexLaforge

1
@AlexLaforge điều kỳ lạ và trớ trêu nhất là trong một câu hỏi stack stackflow khác, câu trả lời như vậy hoàn toàn bị hạ thấp. Nhưng tuy nhiên tôi ủng hộ câu trả lời này và đồng ý, đó là giải pháp tốt cho các điều kiện linh hoạt.
AlexNikonov

3

Quên switchbreak, hãy chơi với if. Và thay vì khẳng định

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

cho phép tạo một số mảng với các trường hợp và kiểm tra nó với 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

Sử dụng dấu phẩy để phân tách trường hợp

switch (pageid)
{
    case "listing-page","home-page":
        alert("hello");
        break;
    case "details-page":
        alert("goodbye");
        break;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.