2010-05-28 12 views
8

Có cách nào tốt hơn để viết điều kiện sau trong javascript?ngắn tay để chuỗi các toán tử logic trong javascript?

if (value == 1 || value == 16 || value == -500 || value == 42.42 || value == 'something') { 
    // blah blah blah 
} 

Tôi ghét có tất cả những OR hợp lý đó kết hợp với nhau. Tôi tự hỏi nếu có một số loại viết tắt.

Cảm ơn!

Trả lời

5
var a = [1, 16, -500, 42.42, 'something']; 
var value = 42; 
if (a.indexOf(value) > -1){ 
// blah blah blah 
} 

Cập nhật: Mẫu chức năng tiện ích như được đề xuất trong nhận xét:

Object.prototype.in = function(){ 
    for(var i = 0; i < arguments.length; i++){ 
    if (this == arguments[i]) return true; 
    } 
    return false; 
} 

Vì vậy, bạn có thể viết:

if (value.in(1, 16, -500, 42.42, 'something')){ 
// blah blah blah 
} 
+8

Chỉ cần lưu ý rằng 'Array.prototype.Phương thức indexOf' không có sẵn trên IE. – CMS

+1

@CMS Cảm ơn bạn đã thông báo có giá trị. Mặc dù, có thể được sửa cùng một lúc. http://stackoverflow.com/questions/1744310/how-to-fix-array-indexof-in-javascript-for-ie-browsers – Li0liQ

+0

Điều này có thể tạo ra một hàm tiện ích tốt để tránh làm cho câu lệnh if phức tạp hơn nguyên. Chỉ cần vượt qua trong một mảng các giá trị và thì bạn có một cú pháp viết tắt. – JohnFx

2

không, đó là cách viết tắt.

như một sự thay thế, bạn có thể làm một switch

switch (value) { 
case 1 : 
case 16 : 
case -500 : 
    .... 
} 

đó là dễ dàng hơn để quản lý nếu bạn cần rất nhiều giá trị có thể, nhưng thực tế phiên bản của bạn là ngắn hơn anyway :)

+0

Nếu được trộn, bạn có thể truyền giá trị vào chuỗi và thực hiện so sánh chuỗi. Chậm hơn nhưng có thể. Tôi cũng nghĩ rằng tùy chọn này có thể đọc được nhiều hơn so với tùy chọn 'indexOf' được trình bày. –

+0

oh bạn nói đúng, tôi nghĩ rằng nó không phải là java không javascript :) – oedo

4

Bạn có thể mở rộng đối tượng mảng:

Array.prototype.contains = function(obj) { 
    var i = this.length; 
    while (i--) { 
    if (this[i] == obj) { 
     return true; 
    } 
    } 
    return false; 
} 

Sau đó, nếu bạn lưu trữ tất cả những giá trị trong một mảng bạn có thể làm một cái gì đó giống như MyValues.contains (giá trị)

+0

Nếu loại cưỡng chế không được mong đợi, tôi khuyên bạn nên sử dụng '===' thay vì '== ', tuy nhiên IMO, với cách tiếp cận này, điều tốt nhất là sử dụng tiêu chuẩn [ Phương thức 'Array.prototype.indexOf'] (https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference/Objects/Array/IndexOf), như [@ Li0liQ] (http://stackoverflow.com/questions/2932131/short-hand-for-chaining-logic-operator-in-javascript/2932166 # 2932166) đề cập, có sẵn * nguyên bản * trên tất cả các trình duyệt ngoại trừ IE. – CMS

+0

Tôi không có javascript pro - tốt để biết. Cảm ơn – Prescott

0

nút chuyển là lựa chọn chấp nhận được. Bạn cũng có thể sử dụng một bản đồ, tùy thuộc vào độ phức tạp của vấn đề (giả sử bạn có nhiều hơn bạn đưa vào ví dụ của bạn).

var accept = { 1: true, 16: true, '-500': true, 42.42: true, something: true }; 
if (accept[value]) { 
    // blah blah blah 
} 

chấp nhận có thể được tạo một cách toàn cầu từ một chuỗi khóa học. Phụ thuộc vào số tiền bạn dự định sử dụng mẫu này. :/

0

Vâng, bạn có thể sử dụng một câu lệnh switch ...

switch (value) { 
    case 1 : // blah 
       break; 
    case 16 : // blah 
       break; 
    case -500 : // blah 
       break; 
    case 42.42: // blah 
       break; 
    case "something" : // blah 
        break; 
} 

Nếu bạn đang sử dụng JavaScript 1.6 hoặc cao hơn, bạn có thể sử dụng các ký hiệu indexOf trên một mảng:

if ([1, 16, -500, 42.42, "something"].indexOf(value) !== -1) { 
    // blah 
} 

Và để đạt được mức tối đa trong hackiness, bạn có thể ép buộc các giá trị thành chuỗi (điều này phù hợp với tất cả các trình duyệt):

if ("1,16,-500,42.42,something".indexOf(value) !== -1) { 
    // blah 
} 
1
var value= -55; 
switch(value){ 
    case 1: case 16: case -55: case 42.5: case 'something': 
     alert(value); break;   

} 
0

Trong một nỗ lực để làm được nêu ra một cách khác để làm việc đó ...

if (/^(1|16|-500|42.42|something)$/.test(value)) { 
    // blah blah blah 
} 

Không cần phải mở rộng mẫu mảng hoặc bất cứ điều gì, chỉ cần sử dụng một regexp nhanh chóng để kiểm tra giá trị!