2011-01-13 50 views

Trả lời

32

Nói chung, bạn có thể sử dụng if(property in object), nhưng điều này sẽ vẫn còn rườm rà cho các thành viên lồng nhau.

Bạn có thể viết một hàm:

function test(obj, prop) { 
    var parts = prop.split('.'); 
    for(var i = 0, l = parts.length; i < l; i++) { 
     var part = parts[i]; 
     if(obj !== null && typeof obj === "object" && part in obj) { 
      obj = obj[part]; 
     } 
     else { 
      return false; 
     } 
    } 
    return true; 
} 

test(someObject, 'member.member.member.value'); 

DEMO

+0

Có vẻ ổn. Tôi thích cách tiếp cận vòng lặp, nhưng làm thế nào để __typeof obj === "đối tượng" __ giúp chính xác? Có đúng là typeof có thể trả về đối tượng cho null và mảng không? – JustcallmeDrago

+0

@JustcallmeDrago: True ... sẽ không quan trọng quá nhiều đối với mảng mặc dù, nhưng nó sẽ thất bại cho 'null'. Vì vậy, nó có lẽ là tốt hơn để thêm một kiểm tra cho null là tốt. Tôi đã thêm bài kiểm tra vì ''value' trong ' sẽ ném một lỗi. Đã thêm kiểm tra 'null'. –

+0

@Felix: Tôi hiểu rồi. Tôi thực sự thích chuỗi như một đối số, nhưng cũng là sự đơn giản của câu trả lời của Patrick. Anh ấy có an toàn như bạn không? Có nhanh không? – JustcallmeDrago

2

Giống như (cảnh báo: Mã chưa được kiểm tra trước)

var testProperty = function(obj, proplist) { 
    for (var i=0; i < proplist.length; i++) { 
     if (obj.hasOwnProperty(proplist[i])) { 
     obj = obj[proplist[i]]; 
     } else { 
     return false; 
     } 
    } 
    return true; 
} 
+0

nên được 'proplist.length'. –

+0

@Felix - cảm ơn, đã sửa.Ngoài ra, xem câu trả lời của Phrogz cho một thay thế cho hasOwnProperty – Malvolio

+0

Xem nhận xét cho câu trả lời của tôi, bạn cũng sẽ thất bại nếu 'obj' là' null'. –

2
if (someObject.member && someObject.member.member && 
    someObject.member.member.member && someObject.member.member.member.value) ... 

hoặc tương tự:

var val = foo.bar && foo.bar.jim && foo.bar.jim.jam && foo.bar.jim.jam.value; 

này sẽ không 'làm việc' nếu có giá trị cụ thể sẽ xảy ra là null, false, 0 hoặc "" (một chuỗi trống), nhưng với ngoại lệ có thể có của giá trị cuối cùng, điều này có vẻ như không xảy ra.

Ngoài ra, lưu ý rằng typeof ____ !== "undefined" không phải là thử nghiệm chính xác để xem một đối tượng có thuộc tính hay không. Thay vào đó, bạn nên sử dụng ___ in object, ví dụ: if ("member" in someObject). Điều này là do bạn có thể đặt thuộc tính thành giá trị rõ ràng là undefined, khác với việc xóa nó với delete someObject.member.

4

Dưới đây là một cách: http://jsfiddle.net/9McHq/

var result = ((((someObject || {}).member || {}).member || {}).member || {}).value; 

alert(result); 
+0

Tốt. Chắc chắn điều này có thể được biến thành một hàm đệ quy khá dễ dàng! – JustcallmeDrago

5

Bạn cũng có thể thử/catch TypeError?

try { 
    console.log(someObject.member.member.member.value); 
} catch(e) { 
    if (e instanceof TypeError) { 
    console.log("Couldn't access someObject.member.member.member.value"); 
    console.log(someObject); 
    } 
} 
2

Theres một hàm safeRead định nghĩa here on thecodeabode cho phép một safeRead tài sản lồng nhau tức

safeRead(foo, 'bar', 'jim', 'jam'); 

nếu bất kỳ thuộc tính là null hoặc không xác định một chuỗi trống được trả lại - hữu ích cho định dạng/chuỗi suy

+0

Tôi thực sự thích giải pháp này – Sukima

+0

Mã đó được viết kém và không hoạt động. – Coldstar

0

Nếu bạn có thể sử dụng lodash thư viện, nó có một giải pháp rất thanh lịch, hasIn.

_.hasIn(someObject, 'member.level1.level2.level3'); 

ví dụ,

var obj = {'x': 999, 'a': {'b': {'c': 123, 'd': 234}}} 
// => undefined 

_.hasIn(obj, 'x') 
// => true 

_.hasIn(obj, 'a.b.d') 
// => true 

_.hasIn(obj, 'a.b.e') 
// => false 
Các vấn đề liên quan