2013-08-14 45 views
6

Có cách nào để tạo nhiều trường hợp trong một câu lệnh chuyển đổi Javascript không?Chuyển đổi trường hợp kết hợp chuỗi regex và số

Trong mã của tôi, tôi nhận được giá trị của một trường thông qua jQuery.

Có thể một trường hợp kiểm tra chuỗi regex và một trường hợp khác cho số của cùng một biến không?

Tôi nghĩ dọc theo dòng:

var field = $(this).val(); 
var msg; 
switch (field) 
{ 
    case field.test('Yes'): 

    msg = "FOO\n"; 
    break; 

    case 10: 
    msg = "BAR\n"; 
    break; 
} 

Mặc dù tôi thấy ở đây: Switch statement for string matching in JavaScript

Đó là cách để sử dụng công tắc trên dây là bằng cách gửi câu lệnh switch một "true" giá trị.

Cách nào ngắn gọn nhất (và chính xác!) Để đạt được điều này?

+0

Theo tôi một 'nếu/else' sẽ là cách súc tích và chính xác nhất, đặc biệt nếu chỉ có hai trường hợp. Nếu có trường hợp bổ sung thì hãy thêm một số nhánh 'else if' nếu cần hoặc bao gồm tất cả các trường hợp số đầu tiên trong' chuyển đổi' và sau đó thực hiện các kiểm tra regex trong 'mặc định'. Bạn _can_ sử dụng 'switch (true)' và sau đó đặt bất kỳ điều kiện nào bạn thích cho mỗi 'case', thực sự tôi đã làm điều đó bản thân mình, nhưng nó chỉ có xu hướng làm cho mã ngắn hơn khi có trường hợp thông qua ... – nnnnnn

+0

bây giờ có ba nhưng có thể có nhiều hơn trong tương lai, tôi muốn mã có thể dễ dàng mở rộng và nếu/không phải là như vậy ... – J00MZ

Trả lời

11

OK, biên dịch cả câu trả lời ở trên mã của tôi mà làm việc và (theo ý kiến ​​của tôi) là thanh lịch nhất là:

var fieldVal = $(this).val(); 

var msg; 

switch (true) 
{ 
    case /Yes/.test(fieldVal): 
     msg = "FOO"; 
     break; 
    case fieldVal > 10 : 
     msg = "BAR"; 
     break; 
} 

này hoạt động như riêng biệt nếu báo cáo kể từ khi chúng tôi đang đánh giá có hay không trường hợp trả về true nhưng một cách rõ ràng hơn và ngắn gọn hơn có thể cho chúng ta tùy chọn thêm các câu lệnh kiểm tra hoàn toàn khác nhau trong một chuyển đổi.

lý do nó hoạt động có lẽ rằng biểu thức trường hợp đánh giá được hiểu như là một giá trị đúng hay sai và sau đó kiểm tra chống lại chính - switch (true)

0

Bạn không thể các trường hợp cần phải có giá trị duy nhất, đó là so với chuyển đổi ngôn luận, nhưng bạn có thể đặt nhiều trường hợp để thực thi mã giống nhau:

switch (field) { 
    case 'Yes': 
    case 'yes': 
    case 'YES': 
     msg = "FOO\n"; 
     break; 

    case 10: 
     msg = "BAR\n"; 
     break; 
} 

nhưng để sử dụng thử nghiệm như trường hợp bạn có thể vượt qua sự thật để chuyển đổi (tôi thấy rằng trick trong một số dự án mã nguồn mở):

switch (true) { 
    case field.test('Yes'): 
     msg = "FOO\n"; 
     break; 
    case field == 10: 
     msg = "BAR\n"; 
     break; 
} 

nhưng điều này cũng giống như if/else

0

Lưu ý: bạn đang sử dụng test() không đúng, đó là phương pháp của đối tượng regex, vì vậy bạn cần /Yes/.test(field) thay vì field.test('Yes'). Dù sao ...

Nếu bạn chỉ có hai trường hợp như sau đó tôi muốn sử dụng một cấu trúc if/else/else if:

var field = $(this).val(); 
var msg; 
if(/Yes/.test(field)) { 
    msg = "FOO\n"; 
} else if (field === 10) { 
    msg = "BAR\n"; 
} 

Nếu bạn cần thêm các trường hợp khác tôi chỉ muốn bổ sung thêm if else {} chi nhánh trên kết thúc.

Nếu bạn có một vài trường hợp số cụ thể mà bạn có thể cân nhắc đặt chúng trong một switch với các bài kiểm tra regex trong một default ở cuối:

switch (field) { 
    case 10: 
     msg = "BAR\n"; 
     break; 
    case 30: 
     msg = "whatever\n"; 
     break; 
    case 50: 
     msg = "hi\n"; 
     break; 
    default: 
     if (/Yes/.test(field)) { 
      msg = "FOO\n"; 
     else if (/No|N|False|/i.test(field)) { 
      msg = "blah\n"; 
     } 
     break; 
} 

Tùy chọn switch (true) bạn ám chỉ trong câu hỏi thực sự chỉ là một Messier phiên bản của một if/else/else if, vì vậy nó không thực sự có ý nghĩa trừ bạn có một số trường hợp rơi qua:

switch(true) 
    case /Yes/.test(field): 
    case /Y/.text(field): 
    case /Whatever/.text(field): 
     msg = "FOO\n"; 
     break; 
    case field == 10: 
     msg = "BAR\n"; 
     break; 
} 

... và thậm chí sau đó là if với nhiều điều kiện được nối bởi || được cho là gọn gàng với các dòng mới thích hợp và kết hợp nhiều regex vào một dòng duy nhất có lẽ là một sự lặp lại rất nhiều.

+0

chỉ để làm rõ, tôi không kiểm tra liệu giá trị trường là một chuỗi hoặc số nhưng một số hoặc chuỗi cụ thể của một trường biến. – J00MZ

+0

Có, đó không phải là kịch bản có trong câu trả lời của tôi không? – nnnnnn

Các vấn đề liên quan