2011-11-29 17 views
8

CurrentY, estoy usando el siguiente código para obtener el país, código postal, localidad y sublocalidad:manera más eficiente para extraer componentes de la dirección

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; 
    } 
} 

Eso es insatisfactoria. ¿Hay alguna otra forma de lograr el mismo resultado?

+0

bastante estúpido que Google construyó de esa manera :( –

Respuesta

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; 
} 

Esta es la solución más adecuada para mí. Puede ayudar a alguien también.

7

Puede acortarlo a

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; 
} 

O tratando de obtener un mejor resultado con formato? Entonces, por favor muéstranos tu consulta.

+0

No, sólo necesito los componentes específicos. – 0xbadf00d

+0

¿Debo siquiera verificar si las variables están indefinidas? Con otras palabras: ¿es posible que haya múltiples componentes en un resultado con tipos iguales? – 0xbadf00d

+0

No tengo ni idea de si eso sucede o no, pero verificar los valores no falsos nos ahorra buscar tipos ya encontrados y, por lo tanto, debería ser un poco más rápido. – Bergi

17

podría utilizar la siguiente función para extraer cualquier componente de la dirección:

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 ""; 
} 

para extraer la información llame:

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"); 

etc ...

3

lo hice como esto :

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; 
}; 

entonces sólo tiene que utilizar

parsed = placeParser(place) 
parsed.route 
0

Visitantes utilizando underscore.js puede convertir fácilmente la matriz address_components en la respuesta de codificación geográfica en un objeto literal:

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

Mi de una sola línea utilizando un enfoque funcional y map, filter y 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; 
} 

Uso:

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

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

Esto es fantástico. Muy efectivo –

1

Realmente creo que user1429980 la respuesta anterior merece más reconocimiento. Funciona realmente bien. Mi respuesta se basa en su función. He añadido algunos ejemplos para ilustrar mejor cómo buscar el objeto JSON utilizando el user1429980 código proporcionado:

//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; }


Ejemplo 1: API reverseGeocode de Google con longitud y latitud establecida en 43.6532,79.3832 (Toronto, Ontario, Canadá):

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


Ejemplo 2: API Lugares de Google con el conjunto lugar identificación para ChIJE9on3F3HwoAR9AhGJW_fL-I (Los Ángeles, CA , EE. UU.):

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

Usando lodash

const result = _.chain(json.results[0].address_components) 
    .keyBy('types[0]') 
    .mapValues('short_name') 
    .value() 
Cuestiones relacionadas