2009-07-15 4 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

다른 방법으로 함수를 만들 수있는, 즉, 기본값을 제공합니다 쓰기, 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 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); 

, 나는 그에게 조금 더 좋은 생각

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의 실패하지 않도록이 개선 될 수 있다고 생각 :

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.

관련 문제