2009-07-15 45 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。