2012-02-02 12 views
29

Làm cách nào để đẹp nhất cách so sánh một giá trị so với các tùy chọn bội số?Javascript: Cách đẹp nhất để so sánh một giá trị với nhiều giá trị

Tôi biết có rất nhiều cách để thực hiện việc này, nhưng tôi đang tìm kiếm gọn gàng nhất.

tôi hỏi, vì tôi đã hy vọng điều này là hoàn toàn khả thi (nó không phải là, khá rõ ràng khi bạn nhìn vào nó):

if (foobar == (foo||bar)) { 
    //do something 
} 
+0

Bạn có thể sử dụng hàm kiểm tra javascript như 'if (/foo |bar |ow |my |javascript|works/.test (foobar)) {/ * làm điều gì đó * /}' Câu hỏi này [simular to mine] (http://stackoverflow.com/questions/12743248/how-to-nest-or-statements-in-javascript) –

Trả lời

51

Đừng cố gắng quá lén lút, đặc biệt là khi nó không cần thiết ảnh hưởng đến hiệu suất. Nếu bạn thực sự có toàn bộ đống so sánh cần làm, chỉ cần định dạng nó một cách độc đáo.

if (foobar === foo || 
    foobar === bar || 
    foobar === baz || 
    foobar === pew) { 
    //do something 
} 
+0

Tôi cuối cùng đã cho bạn điều này bởi vì đó là câu trả lời dễ đọc nhất, ngay cả khi nó không phải là sáng tạo nhất. – thelastshadow

+8

Bạn có thể tăng tốc độ này nếu bạn sắp xếp các từ có xác suất giảm dần là đúng. :) – wenzul

+2

Lời khuyên tốt nhất tôi sẽ nhận được hôm nay! :) – Codeformer

13

Bạn có thể sử dụng một công tắc:

switch (foobar) { 
    case foo: 
    case bar: 
    // do something 
} 
+0

hmm. Cái này hấp dẫn tôi, nhưng tôi lo ngại về tính dễ đọc của nó. – thelastshadow

+0

bạn có thể sử dụng danh sách này cho các danh sách giá trị động thông qua – caleb

+3

Tại sao lại là downvote? Nếu bạn không giải thích những gì bạn nghĩ là sai, nó không thể cải thiện câu trả lời. – Guffa

47

gì tôi sử dụng để làm, được đặt những nhiều giá trị trong một mảng như

var options = [foo, bar]; 

và sau đó, sử dụng indexOf()

if(options.indexOf(foobar) > -1){ 
    //do something 
} 

cho vẻ đẹp:

if([foo, bar].indexOf(foobar) +1){ 
    //you can't get any more pretty than this :) 
} 

và cho trình duyệt cũ hơn:
(https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/IndexOf)

if (!Array.prototype.indexOf) { 
    Array.prototype.indexOf = function (searchElement /*, fromIndex */) { 
     "use strict"; 
     if (this == null) { 
      throw new TypeError(); 
     } 
     var t = Object(this); 
     var len = t.length >>> 0; 
     if (len === 0) { 
      return -1; 
     } 
     var n = 0; 
     if (arguments.length > 0) { 
      n = Number(arguments[1]); 
      if (n != n) { // shortcut for verifying if it's NaN 
       n = 0; 
      } else if (n != 0 && n != Infinity && n != -Infinity) { 
       n = (n > 0 || -1) * Math.floor(Math.abs(n)); 
      } 
     } 
     if (n >= len) { 
      return -1; 
     } 
     var k = n >= 0 ? n : Math.max(len - Math.abs(n), 0); 
     for (; k < len; k++) { 
      if (k in t && t[k] === searchElement) { 
       return k; 
      } 
     } 
     return -1; 
    } 
} 
+1

'indexOf' cho mảng chỉ được cung cấp trong IE bắt đầu bằng phiên bản 9, vì vậy tôi sẽ tránh sử dụng nó cho đến khi 8 ra khỏi thị trường (một cách dài, không may). Điều đó nói rằng, [MDN] (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf) cung cấp mã triển khai mẫu cho các trình duyệt không hỗ trợ nó. – Reid

+1

Phương thức 'Array.indexOf' chỉ được hỗ trợ trong Javascript 1.6 trở lên, vì vậy bạn cần có dự phòng cho các trình duyệt cũ hơn. – Guffa

+0

Reid: Điểm tốt. André: Bản chỉnh sửa của bạn bị thiếu foobar, nhưng chắc chắn nó gọn gàng. – thelastshadow

11

Vì không ai đã bổ sung các giải pháp rõ ràng nhưng mà làm việc tốt cho hai so sánh, tôi sẽ cung cấp:

if (foobar == foo || foobar == bar) { 
    //do something 
} 

Và, nếu bạn có rất nhiều giá trị, sau đó tôi muốn đề nghị thực hiện một Set as điều này làm cho mã so sánh rất sạch sẽ và đơn giản và nó nhanh chóng trong thời gian chạy:

// pre-construct the Set 
var tSet = new Set([foo, bar, test1, test2, test3]); 

// test the Set at runtime 
if (tSet.has(foobar)) { 
    // do something 
} 

Đối với pre-ES6, bạn có thể có được một Đặt polyfill trong đó có rất nhiều. Một được mô tả trong số other answer này.

+0

:) có thể quá rõ ràng. Nó tốt cho đến khi bạn có bốn giá trị để so sánh với một biến. – thelastshadow

0

(foobar == foo || foobar == bar) nếu không, bạn đang so sánh các biểu thức chỉ dựa trên một số nguyên, giá trị được liệt kê hoặc đối tượng Chuỗi bạn có thể sử dụng nút chuyển. Xem The switch Statement. Bạn cũng có thể sử dụng phương pháp được đề xuất bởi André Alçada Padez. Cuối cùng những gì bạn chọn sẽ cần phải phụ thuộc vào các chi tiết của những gì bạn đang làm.

15

Chỉ cần cho đá, vì Q này & Một dường như là về vi phân tích cú pháp, sửa đổi nhỏ nhỏ gợi ý André Alçada Padez của (s):

(và dĩ nhiên chiếm trước -IE9 shim/Shiv/polyfill anh ấy bao gồm)

if (~[foo, bar].indexOf(foobar)) { 
    // pretty 
} 
6

Tại sao không sử dụng indexOf từ mảng như dưới đây?

if ([foo, bar].indexOf(foobar) !== -1) { 
    // do something 
} 

Chỉ Javascript đơn giản, không có khung hoặc thư viện nhưng nó sẽ not work on IE < 9.

0

Phương thức chuyển đổi (như được đề cập bởi Guffa) hoạt động rất độc đáo. Tuy nhiên, các thiết lập cảnh báo mặc định trong hầu hết các máy ủi sẽ cảnh báo bạn về việc sử dụng thông tin giảm. Đó là một trong những lý do chính tôi sử dụng công tắc, vì vậy tôi khá nhiều bỏ qua cảnh báo này, nhưng bạn nên lưu ý rằng việc sử dụng tính năng thu gọn của lệnh chuyển đổi có thể phức tạp. Trong trường hợp như thế này, mặc dù - tôi sẽ đi cho nó.

+0

@Rahul chỉ chỉnh sửa trong backticks là ** KHÔNG ** * Định dạng đúng được thực hiện * – rene

1

Tôi thích hình thức kiểm tra khá đẹpOf với một mảng, nhưng lưu ý, điều này không hoạt động trong tất cả các trình duyệt (because Array.prototype.indexOf is not present in old IExplorers).

Tuy nhiên, có một cách tương tự bằng cách sử dụng jQuery với $.inArray() chức năng:

if ($.inArray(field, ['value1', 'value2', 'value3']) > -1) { 
    alert('value ' + field + ' is into the list'); 
} 

Nó có thể là tốt hơn, vì vậy bạn không nên thử nghiệm nếu indexOf tồn tại.

Hãy cẩn thận với so sánh (không sử dụng == true/false), vì $ .inArray trả về chỉ mục của vị trí phù hợp nơi tìm thấy giá trị và nếu chỉ mục là 0, nó sẽ là sai khi nó thực sự tồn tại trong mảng.