检查是否存在JSON密钥/节点

Set*_*eth 15 javascript json google-maps

我正在使用Google Map API从邮政编码查找中检索城市+州/地区信息.问题是,在某些情况下,邮政编码查找不会检索城市名称.一个例子是92625(美国).

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());
    }
});
Run Code Online (Sandbox Code Playgroud)

在某些情况下,如上所述,结果中不会有城市名称,因此城市将存在未定义的错误,因为关键位置不存在.此错误会阻止脚本的其余部分运行.

我能够通过...来弥补它

    if (place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality != null)
        var city  = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
    else
        var city = '';
Run Code Online (Sandbox Code Playgroud)

...但这让我对其他键的类似错误感到偏执.例如:如果未定义AdministrativeArea,则上述IF语句也会导致未定义的错误.那么我应该检查每个Key/Node是否存在?似乎是一个混乱的方法,因为其中一些键是5级以上的深度...是否有一个更容易的方法,也许一些我不熟悉的JQuery方法?

bac*_*dos 9

或者,你可以创建一个函数,它给你默认值:

function valueOrDefault(val, def) {
    if (def == undefined) def = "";
    return val == undefined ? def : val;
}
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

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

就我个人而言,我觉得它写得比p00ya的提议更好一点,虽然它在未定义的对象中有点笨拙地摆弄...但是可以将其改为:

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
Run Code Online (Sandbox Code Playgroud)