2009-07-15 45 views
15

Tôi đang sử dụng API bản đồ của Google để truy xuất thông tin về tiểu bang/vùng/thành phố từ tra cứu mã bưu chính hay không. Vấn đề là trong một số trường hợp, tra cứu mã bưu điện sẽ không truy xuất tên thành phố. Ví dụ là 92625 (Hoa Kỳ).Kiểm tra xem các khóa/nút JSON có tồn tại

var g = new GClientGeocoder(); 
g.setBaseCountryCode('US'); 
g.getLocations('92625', function(response){ 
    if (response) { 
     var place = response.Placemark[0]; 
     var state = place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName; 
     var city = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName; 
     GLog.write("City = "+city+" : State/Region = "+state+" : Country = " + g.getBaseCountryCode()); 
    } 
}); 

Trong trường hợp nhất định, như vậy sẽ không có tên thành phố do lỗi địa phương không xác định vì địa phương không tồn tại. Lỗi này ngăn phần còn lại của tập lệnh chạy.

tôi đã có thể khắc phục nó bằng cách ...

if (place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality != null) 
     var city = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName; 
    else 
     var city = ''; 

... nhưng điều này đã cho tôi hoang tưởng về một lỗi tương tự cho các phím khác. Ví dụ: Nếu AdministrativeArea không xác định câu lệnh IF ở trên cũng sẽ gây ra lỗi không xác định. Vậy tôi có nên kiểm tra xem mỗi Key/Node có tồn tại không? Có vẻ là một cách tiếp cận lộn xộn bởi vì một số các phím này là 5 cấp độ sâu ... là có một cách dễ dàng hơn để đi về nó, có lẽ một số phương pháp JQuery tôi không quen thuộc với?

Trả lời

9

Ngoài ra, bạn có thể thực hiện một chức năng, cung cấp cho bạn giá trị mặc định:

function valueOrDefault(val, def) { 
    if (def == undefined) def = ""; 
    return val == undefined ? def : val; 
} 

Và sau đó sử dụng nó như thế này:

var place = response.Placemark[0]; 
var state = valueOrDefault(place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName); 
var city = valueOrDefault(place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName); 

Cá nhân, tôi nghĩ rằng đó là một chút đẹp hơn để viết, so với đề xuất của p00ya, mặc dù nó hơi khó hiểu xung quanh trong các đối tượng không xác định ... người ta có thể thay đổi nó thành:

function drill(p, a) { 
a = a.split(".");//add this 
for (i in a) { 
    var key = a[i]; 
    if (p[key] == null) 
    return ''; 
    p = p[key]; 
} 
return p; 
} 
var obj = {foo:{bar:{baz:"quux"}}}; 
var s = drill(obj, "foo.bar.baz"));//and you can use a simple property chain 
3

Bạn có thể sử dụng chức năng "khoan" qua tất cả các cấp lồng nhau đó, đặt mặc định thành chuỗi trống nếu không thể đi xa đến mức đó.

function drill(p, a) { 
for (i in a) { 
    var key = a[i]; 
    if (p[key] == null) 
    return ''; 
    p = p[key]; 
} 
return p; 
} 
var obj = {foo:{bar:{baz:"quux"}}}; 
var s = drill(obj, ["foo", "bar", "baz"])); 
0

Bạn đang tìm kiếm tại chỉ là kết quả đầu tiên trên geocoder mang đến cho bạn:

var place = response.Placemark[0]; 

getLocations() trả về một danh sách một số kết quả. Nếu người đầu tiên không có nó, một trong những kết quả tiếp theo gần như chắc chắn sẽ.

+0

Trong ví dụ trên, luôn có 1 kết quả cho 92625. – Seth

3

Tôi thích cách tiếp cận back2dos' nhưng tôi nghĩ rằng nó có thể được cải thiện để không thất bại với ReferenceError s:

function jPath(obj, a) { 
    a = a.split("."); 
    var p = obj||{}; 
    for (var i in a) { 
     if (p === null || typeof p[a[i]] === 'undefined') return null; 
     p = p[a[i]]; 
    } 
    return p; 
} 

// Tests 
var a = {b:{c:'Hello World!'}, c:null}; 

console.log(jPath(a, 'b.c')); // Hello World 
console.log(jPath(a, 'b.d')); // null 
console.log(jPath(a, 'e.f.g')); // null 
console.log(jPath(a, 'c'));  // null 

var z; 
console.log(jPath(z, 'c'));  // null 

Kiểu này chức năng là rất tốt cho việc chứng thực các cấu trúc sâu JSON trở lại từ các dịch vụ AJAX như Freebase hoặc YQL.

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