Более эффективный способ извлечения компонентов адреса

javascript google-maps google-maps-api-3

13783 просмотра

8 ответа

В настоящее время я использую следующий код для получения страны, почтового индекса, населенного пункта и населенного пункта:

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

Это неудовлетворительно. Есть ли другой способ достичь того же результата?

Автор: 0xbadf00d Источник Размещён: 17.05.2019 03:07

Ответы (8)


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

так далее...

Автор: Johann Размещён: 25.05.2012 04:43

8 плюса

Вы можете сократить его до

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

Или вы пытаетесь получить лучший форматированный результат? Тогда, пожалуйста, покажите нам ваш запрос.

Автор: Bergi Размещён: 29.11.2011 04:18

8 плюса

Мой один лайнер , используя функциональный подход и 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(address_components, "postal_code");
Автор: user1429980 Размещён: 20.10.2016 01:41

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

тогда я просто использую

parsed = placeParser(place)
parsed.route
Автор: stef Размещён: 24.01.2013 01:01

1 плюс

Посетители, использующие underscore.js, могут легко преобразовать address_componentsмассив в ответе геокодирования в литерал объекта:

var obj = _.object( 
    _.map(results[0].address_components, function(c){ 
        return  [c.types[0], c.short_name] 
    })
);
Автор: Jordan Arseno Размещён: 04.11.2015 12:12

1 плюс

С помощью lodash

const result = _.chain(json.results[0].address_components)
  .keyBy('types[0]')
  .mapValues('short_name')
  .value()
Автор: James Размещён: 22.04.2017 05:38

1 плюс

Я действительно считаю, что ответ user1429980 выше заслуживает большего признания. Это работает очень хорошо. Мой ответ основан на его функции. Я добавил несколько примеров, чтобы лучше проиллюстрировать, как искать объект JSON, используя предоставленный код user1429980:

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

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


Пример 1: Google 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: Google Places API с идентификатором места, установленным в ChIJE9on3F3HwoAR9AhGJW_fL-I (Лос-Анджелес, Калифорния, США):

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

Автор: Ignat Ospadov Размещён: 29.01.2017 05:04

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

Это самое подходящее для меня решение. Это тоже может кому-то помочь.

Автор: 0xbadf00d Размещён: 10.12.2011 02:17
Вопросы из категории :
32x32