2010-02-21 30 views
19

Tôi không muốn sử dụng chuyển mạch trong mã của tôi, vì vậy tôi đang tìm một số thay thếlựa chọn cho các "công tắc" Bản Tuyên Bố

Ví dụ với Switch:

function write(what) { 

    switch(what) { 

    case 'Blue': 
     alert ('Blue'); 
    break; 

    ... 

    case 'Red': 
     alert ('Red'); 
    break; 

    } 

} 

Ví dụ mà không cần chuyển mạch :

colors = []; 

colors['Blue'] = function() { alert('Blue'); }; 
colors['Red'] = function() { alert('Red'); }; 


function write(what) { 

    colors[what](); 

} 

câu hỏi của tôi là:

  1. Bạn có biết bất kỳ giải pháp thay thế nào khác không?
  2. Đây có phải là giải pháp tốt nhất không?
+6

Thật tuyệt vời. Để lại nó. – codeholic

+2

vâng, đó là giải pháp tốt hơn với mã ít hơn :) – Sarfraz

+0

Đó sẽ là con đường tôi muốn đi. – brian

Trả lời

19

Tôi chỉ có một lưu ý về cách tiếp cận thứ hai của bạn, bạn shouldn't use an Array để lưu trữ các chỉ số không phải số (mà bạn sẽ gọi bằng các ngôn ngữ khác một kết hợp mảng).

Bạn nên sử dụng một đối tượng đơn giản.

Ngoài ra, bạn có thể muốn kiểm tra nếu đối số what truyền cho chức năng write của bạn tồn tại như một thuộc tính của đối tượng colors của bạn và xem nếu nó là một chức năng, vì vậy bạn có thể gọi nó mà không cần phải lỗi run-time:

var colors = {}; 

colors['Blue'] = function() { alert('Blue'); }; 
colors['Red'] = function() { alert('Red'); }; 


function write(what) { 
    if (typeof colors[what] == 'function') { 
    colors[what](); 
    return; 
    } 
    // not a function, default case 
    // ... 
} 
+0

Với sự tôn trọng, tôi nghĩ rằng bài viết bạn đã liên kết đã sai. Thay vào đó, người ta không nên sử dụng for..in để lặp lại một mảng. –

+1

@machine: Bài viết đó cũng nói về câu lệnh 'for ... in' và các vấn đề xảy ra khi thành viên mẫu thử nghiệm của các hàm dựng sẵn như' Array' và 'Object' được mở rộng, nhưng dòng dưới cùng của bài báo là các mảng JavaScript có nghĩa là số *, và chúng thường được sử dụng để lưu trữ các cặp khóa/giá trị tùy ý, đó là thực hành không tốt ... – CMS

+0

Tóm lại? Sử dụng các thuộc tính expando trên một mảng không thay đổi thực tế đó. Không có gì để đạt được bằng cách biến một trong những đối tượng linh hoạt nhất theo ý của bạn thành ít linh hoạt nhất. Tôi không chắc tại sao bạn lại nói "Bài báo cũng nói" ... Sự hiểu biết của tôi là toàn bộ vấn đề của bài viết là 'hỗ trợ' tốt hơn cho for..in với mảng. –

0

Một cách khác là để xác định một lớp học với một phương pháp write, và ghi đè lên rằng trong lớp con RedBlue để làm điều đúng.

Có hay không tốt hơn giải pháp được đề xuất của bạn, tùy thuộc vào tình huống cụ thể của bạn.

0

Bạn đã có khá nhiều ở đó rồi. Nếu có thể bạn có thể muốn thêm một hàm trợ giúp để làm cho việc thiết lập dễ dàng hơn. Ví dụ:

function setup(what) 
{ 
    colors[what] = function() { alert(what); }; 
} 

EDIT:
Nếu những gì bạn muốn làm cho mỗi tùy chọn phức tạp hơn rõ ràng điều này sẽ không làm việc. Như đã đề cập trong các bình luận của @roe, điều này sử dụng các màu toàn cầu mà thường bị cau mày.

+0

Ý tưởng tuyệt vời! Cảm ơn bạn. – Bambert

+2

Điều này chỉ hoạt động cho ví dụ cụ thể này, rất có thể là chúng không có nhiều điểm chung trong thực tế. Ngoài ra màu sắc là một toàn cầu ở đây, mà hiếm khi là một điều tốt. – falstro

+0

Tôi sẽ chỉnh sửa phản hồi để làm rõ hơn. – smaclell

1

Câu hỏi 2:

Thông thường, nếu bạn có thể thay thế các cấu trúc điều khiển quen thuộc với một tra cứu từ điển, bạn hoàn toàn tốt đẹp. Thật dễ dàng để đọc và rất thanh lịch - gắn bó với nó.

0

Như tôi đã nói, rất tuyệt. Điều duy nhất tôi có thể thêm vào giải pháp của bạn là có lẽ tốt hơn để bản địa hóa số colors của bạn.

function write(what) { 
    var colors = []; 
    colors['Blue'] = function() { alert('Blue'); }; 
    colors['Red'] = function() { alert('Red'); }; 
    colors[what](); 
} 
2

Bạn có thể sử dụng đối tượng trực, và cố gắng nắm bắt để bẫy các mặc định:

function write(what) { 
    var colors = { 
    'Blue': function(){ alert('Light-Blue'); }, 
    'Red': function(){ alert('Deep-Red'); }, 
    'Green': function(){ alert('Deep-Green'); } 
    } 
    try {colors[what]();} 
    catch(err) {colors['Green']();}//default behaviour 
} 
write('Pink'); 
5

tôi đã sử dụng một cấu trúc như ngày hôm nay:

var chosenColor = 'red'; 

var colorString = { 
    'red': 'The color is red.', 
    'green': 'The color is green.', 
    'blue': 'The color is blue.', 
}[chosenColor] || 'The color is unknown.'; 

Tôi thích rằng đó là một số lượng mã thực sự nhỏ để chọn chuỗi dựa trên lựa chọn.

Bạn cũng có thể vượt qua nó để một hàm:

alert({ 
    'red': 'The color is red.', 
    'green': 'The color is green.', 
    'blue': 'The color is blue.', 
}[chosenColor] || 'The color is unknown.'); 
+0

ngắn và đơn giản, giống như nó. +1 – schellmax

+0

điều này thật thú vị miễn là màu selectedColor tồn tại trong colorString. nếu selectedColor là 'cam' ví dụ, bạn sẽ nhận được một lỗi Type. – northamerican

+1

Thực tế, bạn có thể dễ dàng thêm tùy chọn mặc định với '({'đỏ': 'màu đỏ'}) [selectedColor] || 'default'' – superzamp

1

tôi phải làm làm một so sánh cho một loại nhóm các đạo cụ đối tượng để có danh sách và không muốn làm một công tắc/trường hợp cho tất cả các khả năng vì vậy tôi đã làm một mảng các đối tượng gán cho một xếp hạng số đầu tiên để trường hợp trở thành một so sánh đơn giản. Đây là chỉ có 4 khả năng nhưng bạn sẽ có được trôi dạt làm thế nào để mở rộng này để tình huống mà một switch/trường hợp trở nên không thể quản lý:

chức năng mySort2 (ITEM1, ITEM2) {

 var matrix = { 
    'repair': 4, 
    'r/r': 3, 
    'part': 2, 
    'misc': 1 
    }; 

(matrix[item1.category] < matrix[item2.category]) ? return +1 : return -1; 

// nếu có thể dữ liệu xấu cần phải kiểm tra cho điều này đầu tiên?

i1=matrix[item1.category] || null; 
i2=matrix[item2.category] || null; 

if (i1==null){ 
    // handle bad data in item 1 
    return +1; // put it after 2 
} 

if (i2==null){ 
    // ditto 
    return -1; //put 1 first 
} 

if (i1<i2) 
    return +1; 
else 
    return -1; 

}

+0

Câu trả lời của nó: một giải pháp thay thế cho việc sử dụng công tắc/trường hợp cho mục đích này. Bạn cũng có thể sử dụng [] của [] để có ma trận thực tế của các giá trị cần trả lại. – Icedvolvo

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