Skip to content Skip to sidebar Skip to footer

More Efficient Way To Extract Address Components

Currenty, I'm using the following code to get the country, postal code, locality and sub-locality: var country, postal_code, locality, sublocality; for (i = 0; i < results[0].ad

Solution 1:

You could use the following function to extract any address component:

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

To extract the info you call:

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...

Solution 2:

My one-liner using a functional approach and map, filter, and 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)
 */functionextractFromAddress(components, type) {
    return components.filter((component) => component.types.indexOf(type) === 0).map((item) => item.long_name).pop() || null;
}

Usage:

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

const postal_code = extractFromAddress(address_components, "postal_code");

Solution 3:

You can shorten it to

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;
    elseif (!locality && component.types.indexOf("locality") > -1)
        locality = component.long_name;
    elseif (!postal_code && component.types.indexOf("postal_code") > -1)
        postal_code = component.long_name;
    elseif (!country && component.types.indexOf("country") > -1)
        country = component.long_name;
}

Or are you trying to get a better formatted result? Then please show us your query.

Solution 4:

I did it like this:

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

then i just use

parsed = placeParser(place)
parsed.route

Solution 5:

Using lodash

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

Post a Comment for "More Efficient Way To Extract Address Components"