2010-11-02 42 views
29

Có cách nào để viết câu lệnh chuyển đổi có điều kiện trong javascript không?Tuyên bố chuyển đổi điều kiện Javascript

Tôi đoán không, vì sau sẽ luôn luôn mặc định:

var raw_value = 11.0; 
    switch(raw_value) 
    { 
     case (raw_value > 10.0): 
      height = 48; 
      width = 36; 
      break; 
     case (raw_value > 5.0): 
      height = 40; 
      width = 30; 
      break; 
     default: 
      height = 16; 
      width = 12; 
      break; 
    } 

Nếu không, những gì tôi nên sử dụng thay vì - một chặng đường dài nếu/else?

nhờ :)

+0

Một giải pháp tốt đẹp sẽ là một mảng, và một phiên bản JavaScript của này [câu hỏi PHP gần đây] (http://stackoverflow.com/questions/4032753/picking-the-nearest-value-from-an-array-reflecting-ranges) .... nhưng đó không phải là tầm thường đối với cổng. –

+0

Nó không phải là dài của một câu lệnh if - else (nếu khác nếu có). Khá chuẩn (và ít thụt đầu dòng). –

+0

Nếu/người khác mất ít không gian hơn, dễ đọc hơn, ít để viết và ít bị lỗi tự gây ra. – BGerrissen

Trả lời

23

Trong một switch statement, giá trị đánh giá của biểu thức switch được so sánh với các giá trị các đánh giá trong các trường hợp. Vì vậy, ở đây giá trị của raw_value (số) được so sánh với raw_value > 10.0 (biểu thức so sánh) và raw_value > 5.0 (biểu thức so sánh).

Vì vậy, trừ khi một trong các biểu thức trường hợp của bạn mang lại số bằng 11.0 hoặc bạn sử dụng biểu thức switchtrue, bạn sẽ luôn nhận được trường hợp mặc định.

Chỉ cần sử dụng một đơn giản if/else thay vì:

var raw_value = 11.0; 
if (raw_value > 10.0) { 
    height = 48; 
    width = 36; 
} else if (raw_value > 5.0) { 
    height = 40; 
    width = 30; 
} else { 
    height = 16; 
    width = 12; 
} 
+1

Và không cần đến 'ngắt', nó chỉ sạch như bản gốc. –

1

Không, báo cáo kết quả switch không hoạt động sử dụng như thế. Tuy nhiên, tuyên bố này không phải lúc nào cũng đơn giản hơn. Ví dụ, phiên bản switch mất 15 dòng:

var raw_value = 11.0; 
switch(raw_value) { 
    case (raw_value > 10.0): 
     height = 48; 
     width = 36; 
     break; 
    case (raw_value > 5.0): 
     height = 40; 
     width = 30; 
     break; 
    default: 
     height = 16; 
     width = 12; 
     break; 
} 

và "dài" if/else phiên bản chỉ 11:

var raw_value = 11.0; 
if (raw_value > 10.0) { 
     height = 48; 
     width = 36; 
} else if (raw_value > 5.0) { 
     height = 40; 
     width = 30; 
} else { 
     height = 16; 
     width = 12; 
} 

Vì vậy, trong trường hợp của bạn, nó là tốt hơn để sử dụng một giây hơn là người đầu tiên ...

+0

Ít dòng mã không phải là khách quan "tốt hơn", vì "mã tốt" là chủ quan. Dễ đọc và dễ hiểu là hai yếu tố khác.Tôi có lẽ sẽ thêm rằng cách tiếp cận này là tốt hơn "nếu mục tiêu đang sử dụng càng ít dòng mã càng tốt" – GrayedFox

88

như thế này:

var raw_value = 11.0; 
switch(true) { 
    case (raw_value > 10.0): 
     height = 48; 
     width = 36; 
     break; 
    case (raw_value > 5.0): 
     height = 40; 
     width = 30; 
     break; 
    default: 
     height = 16; 
     width = 12; 
} 

Các biểu thức trong câu lệnh case sẽ đánh giá là true hoặc false và nếu điều đó khớp với điều kiện switch ... voilà. default hoạt động như một else.

Phần thưởng: bạn có thể đảo ngược toàn bộ logic bằng cách thay thế đơn giản true bằng false. Với câu lệnh if ... else if, bạn phải chỉnh sửa từng mệnh đề riêng lẻ.

+3

Điều này sẽ là câu trả lời đúng, vì nó làm những gì OP hỏi trong kiểu hỏi. Tuy nhiên, tôi đã có một thời gian khó khăn lần đầu tiên tôi nhìn thấy một tuyên bố chuyển đổi (đúng). –

+0

Vui mừng vì đã giúp ít nhất một người. :) – DanMan

+1

Được bỏ phiếu và được đánh dấu là câu trả lời. Hầu hết các lập trình viên (hoặc có thể chỉ với tôi) với ngôn ngữ máy chủ. tìm thấy việc triển khai JS không trực quan. Kiểu kỳ lạ của nó bắt đầu biểu hiện được đánh giá và làm việc ngược! –

0

Đừng cố gắng này ở nhà, hoặc mang nó nghiêm túc, đây là chỉ để cho vui ...

function conditionalSwitch(value, cond, callback /* cond, callback, cond, callback, ... */) 
{ 
    for (var i = 1; i < arguments.length; i += 2) { 
    if (arguments[i](value)) { 
     arguments[i+1](value); 
     return; 
    } 
    } 
} 

var width, height; 

conditionalSwitch(5.1, 

    function(val) { return val > 10 }, 
    function() { 
    height = 48; 
    width = 36 
    }, 

    function(val) { return val > 5 }, 
    function() { 
    height = 40; 
    width = 30 
    }, 

    //Default 

    function(val) { return true }, 
    function() { 
    height = 16; 
    width = 12; 
    } 
) 

console.log(width, height); 
+0

Với những thứ này, nó chủ yếu là về đường cú pháp .... – Lodewijk

+1

Erm, không nên có trong codepen hay gì đó, một số nơi vui vẻ! Không thấy điểm của nó ở đây ... –

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