2011-11-29 31 views
8

Currenty,我使用下面的代碼,以獲得國家,郵政編碼,地區和次地區:更有效的方式來提取地址組件

var country, postal_code, locality, sublocality; 
for (i = 0; i < results[0].address_components.length; ++i) 
{ 
    for (j = 0; j < results[0].address_components[i].types.length; ++j) 
    { 
     if (!country && results[0].address_components[i].types[j] == "country") 
      country = results[0].address_components[i].long_name; 
     else if (!postal_code && results[0].address_components[i].types[j] == "postal_code") 
      postal_code = results[0].address_components[i].long_name; 
     else if (!locality && results[0].address_components[i].types[j] == "locality") 
      locality = results[0].address_components[i].long_name; 
     else if (!sublocality && results[0].address_components[i].types[j] == "sublocality") 
      sublocality = results[0].address_components[i].long_name; 
    } 
} 

這是不能令人滿意的。有沒有其他辦法可以達到同樣的效果?

+0

非常愚蠢的,谷歌建立了它這樣的:( –

回答

0
if (typeof Object.keys == 'function') 
    var length = function(x) { return Object.keys(x).length; }; 
else 
    var length = function() {}; 

var location = {};  
for (i = 0; i < results[0].address_components.length; ++i) 
{ 
    var component = results[0].address_components[i]; 
    if (!location.country && component.types.indexOf("country") > -1) 
     location.country = component.long_name; 
    else if (!location.postal_code && component.types.indexOf("postal_code") > -1) 
     location.postal_code = component.long_name; 
    else if (location.locality && component.types.indexOf("locality") > -1) 
     location.locality = component.long_name; 
    else if (location.sublocality && component.types.indexOf("sublocality") > -1) 
     location.sublocality = component.long_name; 

    // nothing will happen here if `Object.keys` isn't supported! 
    if (length(location) == 4) 
     break; 
} 

這是最適合我的解決方案。它也可能幫助別人。

7

可以縮短到

var country, postal_code, locality, sublocality; 
for (i = 0; i < results[0].address_components.length; ++i) { 
    var component = results[0].address_components[i]; 
    if (!sublocality && component.types.indexOf("sublocality") > -1) 
     sublocality = component.long_name; 
    else if (!locality && component.types.indexOf("locality") > -1) 
     locality = component.long_name; 
    else if (!postal_code && component.types.indexOf("postal_code") > -1) 
     postal_code = component.long_name; 
    else if (!country && component.types.indexOf("country") > -1) 
     country = component.long_name; 
} 

或者,你想獲得更好的格式的結果?然後請向我們展示您的查詢。

+0

不,我只需要在特定組件。 – 0xbadf00d

+0

我甚至需要檢查變量是否未定義?換句話說:在一個結果中有多個組件可能具有相同的類型? – 0xbadf00d

+0

我不知道是否會發生這種情況,但是檢查不是否是falsy值會使我們無法搜索已找到的類型,因此應該更快一點。 – Bergi

17

您可以使用下面的函數來提取任何地址分量:

function extractFromAdress(components, type){ 
    for (var i=0; i<components.length; i++) 
     for (var j=0; j<components[i].types.length; j++) 
      if (components[i].types[j]==type) return components[i].long_name; 
    return ""; 
} 

要提取您調用信息:

var postCode = extractFromAdress(results[0].address_components, "postal_code"); 
var street = extractFromAdress(results[0].address_components, "route"); 
var town = extractFromAdress(results[0].address_components, "locality"); 
var country = extractFromAdress(results[0].address_components, "country"); 

等等

3

我做了這樣的:

placeParser = function(place){ 
    result = {}; 
    for(var i = 0; i < place.address_components.length; i++){ 
    ac = place.address_components[i]; 
    result[ac.types[0]] = ac.long_name; 
    } 
    return result; 
}; 

然後我只是使用利用underscore.js

parsed = placeParser(place) 
parsed.route 
0

遊客可以容易地將address_components數組轉換在地理編碼到響應對象文本:

var obj = _.object( 
    _.map(results[0].address_components, function(c){ 
     return [c.types[0], c.short_name] 
    }) 
); 
4

使用功能的方法和map我的單行, filter,以及ES2015:

/** 
* Get the value for a given key in address_components 
* 
* @param {Array} components address_components returned from Google maps autocomplete 
* @param type key for desired address component 
* @returns {String} value, if found, for given type (key) 
*/ 
function extractFromAddress(components, type) { 
    return components.filter((component) => component.types.indexOf(type) === 0).map((item) => item.long_name).pop() || null; 
} 

用法:

const place = autocomplete.getPlace(); 
const address_components = place["address_components"] || []; 

const postal_code = extractFromAddress("postal_code"); 
+0

這太棒了。非常有效 –

1

我真的相信user1429980以上的答案值得更多的認可。它工作得很好。我的回答是基於他的功能。我已經添加了幾個例子來更好地說明了如何使用所提供的代碼user1429980搜索JSON對象:

//searches object for a given key and returns the key's value

extractFromObject (object, key) { return object.filter((object) => component.types.indexOf(key) === 0).map((item)=>item.long_name).pop() || null; }


例1:谷歌與經度reverseGeocode API和緯度設置爲43.6532,79。3832(多倫多,安大略省,加拿大):

var jsonData = {} //object contains data returned from reverseGeocode API

var city = extractFromObject(jsonData.json.results[0].address_components, 'locality');

console.log(city); //Output is Toronto


例2:谷歌的地方與地方ID設置爲ChIJE9on3F3HwoAR9AhGJW_fL-I(洛杉磯,加利福尼亞API ,USA):

var jsonData = {} //object contains data returned from Google's Places API

var city = extractFromObject(jsonData.json.result.address_components, 'locality');

console.log(city); //Output is Los Angeles

1

使用lodash

const result = _.chain(json.results[0].address_components) 
    .keyBy('types[0]') 
    .mapValues('short_name') 
    .value() 
相關問題