2009-07-15 84 views
15

我正在使用Google Map API從郵政編碼查找中檢索城市+州/地區信息。問題在於,在某些情況下,郵政編碼查詢不會檢索城市名稱。一個例子是92625(美國)。檢查JSON密鑰/節點是否存在

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()); 
    } 
}); 

在某些情況下,如上面提到的,不會出現在結果是一個城市的名稱,這樣就會有城市一個未定義的錯誤,因爲關鍵地點不存在。此錯誤會阻止腳本的其餘部分運行。

我能夠彌補它...

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

...但是這有我偏執有關其他按鍵類似的錯誤。例如:如果AdministrativeArea未定義,則上面的IF語句也會導致未定義的錯誤。那麼我應該檢查一下每個鍵/節點是否存在?似乎是一個混亂的方法,因爲其中的一些鍵的深度是5級以上...是否有更簡單的方法去實現它,也許是我不熟悉的一些JQuery方法?

回答

9

或者,你可以做一個功能,即讓你的默認值:

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

,然後用它是這樣的:

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

就個人而言,我認爲這是一個更好一點,以寫,比p00ya的建議,雖然它是一個有點hacky在未定義的對象周圍擺弄......也許可以改變它:

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

你可以使用一個函數來「鑽取」所有這些嵌套層次,如果它不能到達那麼遠,則默認爲空字符串。

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

您正在尋找在只有第一個結果地理編碼器爲您提供:

var place = response.Placemark[0]; 

getLocations()返回的多個結果列表。如果第一個沒有它,幾乎肯定會有下一個結果。

+0

在上面的例子中,92625總是隻有1個結果。 – Seth 2009-07-15 17:15:25

3

我喜歡back2dos'的做法,但我認爲它可以改進,以免失敗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 

這種功能是偉大的,從AJAX服務,如遊離鹼的驗證深JSON迴路結構或YQL。