2009-07-15 21 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の提案よりも、未定義のオブジェクトでちょっとハックしているかもしれません... ...

あなたが唯一の最初の結果を見ている210
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

3

私はback2dos'アプローチを好むが、私はReferenceError Sで失敗しないように、それを向上させることができると思います。このような機能は、遊離塩基としてAJAXサービスから深いJSONリターン構造を検証するための素晴らしいです

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 

またはYQL。

関連する問題