根据该密钥中的数值查找密钥的值

问题描述:

这是一个脑筋急转弯,所以我使用places API(使用ember.js的插件,所以我真的不能控制该版本,除非我想写我自己),并返回我的数据,看起来像这样根据该密钥中的数值查找密钥的值

{ 
    "address_components": [ 
    { 
     "long_name": "1235", 
     "short_name": "1235", 
     "types": [ 
     "street_number" 
     ] 
    }, 
    { 
     "long_name": "Long Point Road", 
     "short_name": "Long Point Rd", 
     "types": [ 
     "route" 
     ] 
    }, 
    { 
     "long_name": "Mount Pleasant", 
     "short_name": "Mt Pleasant", 
     "types": [ 
     "locality", 
     "political" 
     ] 
    }, 
    { 
     "long_name": "Charleston County", 
     "short_name": "Charleston County", 
     "types": [ 
     "administrative_area_level_2", 
     "political" 
     ] 
    }, 
    { 
     "long_name": "South Carolina", 
     "short_name": "SC", 
     "types": [ 
     "administrative_area_level_1", 
     "political" 
     ] 
    }, 
    { 
     "long_name": "United States", 
     "short_name": "US", 
     "types": [ 
     "country", 
     "political" 
     ] 
    }, 
    { 
     "long_name": "29464", 
     "short_name": "29464", 
     "types": [ 
     "postal_code" 
     ] 
    }, 
    { 
     "long_name": "9020", 
     "short_name": "9020", 
     "types": [ 
     "postal_code_suffix" 
     ] 
    } 
    ], 
    "adr_address": "<span class=\"street-address\">1235 Long Point Rd</span>, <span class=\"locality\">Mt Pleasant</span>, <span class=\"region\">SC</span> <span class=\"postal-code\">29464-9020</span>, <span class=\"country-name\">USA</span>", 
    "formatted_address": "1235 Long Point Rd, Mt Pleasant, SC 29464, USA", 
    "geometry": { 
    "location": { 
     "lat": 32.8570647, 
     "lng": -79.8224902 
    } 
    }, 
    "icon": "https://maps.gstatic.com/mapfiles/place_api/icons/geocode-71.png", 
    "id": "f3d33a1a65adc47f7fcf927bb7b18ea91a59fb81", 
    "name": "1235 Long Point Rd", 
    "place_id": "ChIJkVjE8_5t_ogRvHeqOGZ6cB0", 
    "reference": "CpQBjAAAAJEVbHvc6lTEXUvlKHc-wTI3f8g8U6W7i6oARvPyP_2TWTNE7IJQQHTABvbxTtMK6cFxRaksi2xaT7lcQiRB-nv7co7BVzfUMrwqr0YFQZvbLH_OGflPlO---vX4GPTQlDnFinnnixHW7LcRGbPJ4jfgnQ3HnURUCUmCa0WrLTIxiuqEwzIljAGv9K_iUMU9nBIQE57UebJ0CfCs9y0MBBvGeRoUUovGUbFYmgCnPOKVlXhrLQaE5uY", 
    "scope": "GOOGLE", 
    "types": [ 
    "street_address" 
    ], 
    "url": "https://maps.google.com/?q=1235+Long+Point+Rd,+Mt+Pleasant,+SC+29464,+USA&ftid=0x88fe6dfef3c45891:0x1d707a6638aa77bc", 
    "vicinity": "Mount Pleasant", 
    "html_attributions": [] 
} 

所以你可以看到每个对象都有值types关键,涉及到他们是什么类型的对象address_components部分,例如如street_numberroute。我想要做的是获得对象的short_name(或long_name),其中type包含street_numberroute等等,并且能够将它们设置为变量或以某种其他方式使用它们。

我已经尝试了几个地址,它以大致相同的顺序返回它们,但是有时在该数组中有一个或多个项目,因此它并不总是以完全相同的顺序返回相同数量的项目。因此,不要试图查看索引,并希望这是我期望的正确值,我希望根据type的说法得到这些值。

我使用的是ember.js,所以如果有一个计算属性的方式可能做到这一点很酷,但我打开使用JavaScript/jQuery函数来做到这一点。

+0

应该怎么可能结果是什么样子? –

你可以写一个函数

function getAdress(what, obj) { 
    return obj.address_components.filter(function(item) { 
     return item.types.indexOf(what) !== -1; 
    }).shift(); 
} 

,当你需要找到一些使用它

getAdress('street_number', obj).short_name 

FIDDLE

+0

不错的答案@ adeneo。但是shift()是做什么的? – sfletche

+0

@sfletche - 因为它正在过滤一个数组,所以'shift'移出该数组中的第一个匹配。根据OP的代码,反正只会有一场比赛。 – adeneo

+0

根据文档,“shift()方法从数组中移除第一个元素并返回该元素。”来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/shift。基本上,@adeneo正在使用OP的JSON在该字段上只有一个匹配来返回它的事实(正如他上面所解释的)。做得好。 –