2009-06-18 24 views
68

Tôi có yêu cầu áp dụng toán tử C# ?? C# cho JavaScript và tôi không biết cách thực hiện. Hãy xem xét điều này trong C#:Thay thế giá trị nếu không hoặc không xác định trong JavaScript

int i?=null; 
int j=i ?? 10;//j is now 10 

Bây giờ tôi đã thiết lập này trong JavaScript:

var options={ 
     filters:{ 
      firstName:'abc' 
     } 
    }; 
var filter=options.filters[0]||'';//should get 'abc' here, it doesn't happen 
var filter2=options.filters[1]||'';//should get empty string here, because there is only one filter 

Làm thế nào để làm điều đó một cách chính xác?

Cảm ơn.

EDIT: Tôi phát hiện một nửa vấn đề: Tôi không thể sử dụng ký hiệu 'chỉ mục' cho các đối tượng (my_object[0]). Có cách nào để vượt qua nó? (Tôi không biết tên của các thuộc tính bộ lọc trước và không muốn lặp lại chúng).

Trả lời

163

Dưới đây là tương đương với JavaScript:

var i = null; 
var j = i || 10; //j is now 10 

Lưu ý rằng logical operator || không trả lại một giá trị boolean nhưng giá trị đầu tiên mà có thể được chuyển đổi sang đúng.

Thêm vào đó sử dụng một mảng các đối tượng thay vì một đối tượng duy nhất:

var options = { 
    filters: [ 
     { 
      name: 'firstName', 
      value: 'abc' 
     } 
    ] 
}; 
var filter = options.filters[0] || ''; // is {name:'firstName', value:'abc'} 
var filter2 = options.filters[1] || ''; // is '' 

Điều đó có thể được truy cập bởi chỉ số.

+21

Lưu ý rằng điều này không có tác dụng nếu 0 là một giá trị hợp lệ của tôi. – jt000

+4

Nếu bất cứ điều gì falsey là một đầu vào có khả năng hợp lệ ('0',' false', chuỗi rỗng), tôi sẽ làm một cái gì đó như thế này thay vào đó: 'var j = (i === null)? 10: i; 'Sẽ chỉ thay thế' null', thay vì bất cứ thứ gì có thể được đánh giá thành sai. – DBS

+0

Có tương đương với điều này trong Groovy không? – user6123723

6

Tôi phát hiện một nửa vấn đề: Tôi không thể sử dụng ký hiệu 'chỉ mục' cho đối tượng (my_object [0]). Có cách nào để vượt qua nó?

Không; một đối tượng theo nghĩa đen, như tên của nó, là một đối tượng và không phải là mảng, do đó bạn không thể truy xuất thuộc tính dựa trên chỉ mục vì không có thứ tự cụ thể của thuộc tính của chúng. Cách duy nhất để lấy giá trị của họ là sử dụng tên cụ thể:

var someVar = options.filters.firstName; //Returns 'abc' 

Hoặc bằng cách duyệt qua chúng bằng cách sử dụng for ... in loop:

for(var p in options.filters) { 
    var someVar = options.filters[p]; //Returns the property being iterated 
} 
+0

Omg một vòng lặp 'for in' trong JS, cảm ơn, ha! – LinusGeffarth

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