Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 提取地址组件的更有效方法_Javascript_Google Maps_Google Maps Api 3 - Fatal编程技术网

Javascript 提取地址组件的更有效方法

Javascript 提取地址组件的更有效方法,javascript,google-maps,google-maps-api-3,Javascript,Google Maps,Google Maps Api 3,目前,我使用以下代码获取国家、邮政编码、地区和子地区: 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 &&a

目前,我使用以下代码获取国家、邮政编码、地区和子地区:

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;
    }
}
var国家、邮政编码、地区、次地区;
对于(i=0;i
这不能令人满意。有没有其他方法可以达到同样的效果?

您可以将其缩短为

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;
}
var国家、邮政编码、地区、次地区;
对于(i=0;i-1)
子局部性=component.long\u名称;
else if(!locality&&component.types.indexOf(“locality”)>-1)
Location=component.long\u名称;
else if(!postal_code&&component.types.indexOf(“postal_code”)>-1)
邮政编码=组件.long\u名称;
else if(!country&&component.types.indexOf(“country”)>-1)
国家/地区=组件.long\u名称;
}
或者您正在尝试获得更好的格式化结果?然后请向我们显示您的查询。

if(typeof Object.keys==“function”)
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;
}
var length=函数(x){return Object.keys(x).length;}; 其他的 var length=function(){}; 变量位置={}; 对于(i=0;i-1) location.country=component.long\u name; else if(!location.postal\u code&&component.types.indexOf(“postal\u code”)>-1) location.postal\u code=组件.long\u名称; else if(location.locality&&component.types.indexOf(“locality”)>-1) location.locality=component.long\u name; else if(location.sublocality&&component.types.indexOf(“sublocality”)>-1) location.sublocality=component.long\u name; //如果不支持'Object.keys',这里将不会发生任何事情! 如果(长度(位置)==4) 打破 }

这是最适合我的解决方案。它也可能对某些人有所帮助。

您可以使用以下函数提取任何地址组件:

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

我是这样做的:

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

使用下划线.js的访问者可以轻松地将地理代码响应中的
地址\u组件
数组转换为对象文字:

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

使用功能方法和
映射
过滤器
和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提供的代码搜索JSON对象:

//在对象中搜索给定的键并返回键的值

extractFromObject(对象,键){
返回object.filter((组件)=>component.types.indexOf(键)
==0).map((项)=>item.long_name).pop()| | null;
}


示例1:谷歌的反向编码API,经度和纬度设置为43.6532,79.3832(加拿大安大略省多伦多):

var jsonData={}//对象包含从reverseGeocode API返回的数据

var city=extractFromObject(jsonData.json.results[0]。地址_components,'locality')

console.log(城市)//输出为多伦多


示例2:Google的Places API,其place ID设置为ChIJE9on3F3HwoAR9AhGJW_fL-I(美国加利福尼亚州洛杉矶):

var jsonData={}//对象包含从Google的Places API返回的数据

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


console.log(城市)//输出是洛杉矶

使用
洛达斯

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

在此之前,我创建了一个函数,该函数提取给定位置类型列表的值列表:

const getValue = function(data, types=[]){
/* used by results taken from Geocoder.geocode api */
const values = data.reduce((values, address) => {
    return address.address_components.reduce((values2, component) => {
        if(component.types.reduce((result, type) => result || types.indexOf(type) > -1, false))
            values2.push(component.long_name);
        return values2
    }, []);

    if(buff.length)
        return [...values, ...buff];
    return values;
}, []).filter(
    (value, index, self) => {
        return self.indexOf(value) === index;
    }
);

}

不,我只需要特定的组件。我是否需要检查变量是否未定义?换言之:一个结果中是否可能有多个相同类型的组件?我不知道是否会发生这种情况,但检查not falsy值可以避免我们搜索已经找到的类型,因此应该会快一点。这太棒了。非常有效非常有才华的ans。这是有用的定位和路线不再工作,你有解决方案吗?
const result = _.chain(json.results[0].address_components)
  .keyBy('types[0]')
  .mapValues('short_name')
  .value()
const getValue = function(data, types=[]){
/* used by results taken from Geocoder.geocode api */
const values = data.reduce((values, address) => {
    return address.address_components.reduce((values2, component) => {
        if(component.types.reduce((result, type) => result || types.indexOf(type) > -1, false))
            values2.push(component.long_name);
        return values2
    }, []);

    if(buff.length)
        return [...values, ...buff];
    return values;
}, []).filter(
    (value, index, self) => {
        return self.indexOf(value) === index;
    }
);