给定一个JSON对象数组,我怎样才能得到基于嵌套值的JSON对象?
我正在使用谷歌地图geocoding API获取以下JSON对象,基于一个地址:
{ "results":[ { "address_components":[ { "long_name":"643", "short_name":"643", "types":[ "subpremise" ] }, { "long_name":"900", "short_name":"900", "types":[ "street_number" ] }, { "long_name":"Folsom Street", "short_name":"Folsom St", "types":[ "route" ] }, { "long_name":"South of Market", "short_name":"South of Market", "types":[ "neighborhood", "political" ] }, { "long_name":"San Francisco", "short_name":"SF", "types":[ "locality", "political" ] }, { "long_name":"San Francisco County", "short_name":"San Francisco County", "types":[ "administrative_area_level_2", "political" ] }, { "long_name":"California", "short_name":"CA", "types":[ "administrative_area_level_1", "political" ] }, { "long_name":"United States", "short_name":"US", "types":[ "country", "political" ] }, { "long_name":"94107", "short_name":"94107", "types":[ "postal_code" ] }, { "long_name":"1007", "short_name":"1007", "types":[ "postal_code_suffix" ] } ] } ] }
题
如何根据特定的types获取address_components
数组中对象的long_name
和long_name
?
例
我想获取那些在其types
数组中具有"locality"
对象的long_name
和 long_name
。
上下文
我正在使用这些信息来构build一个使用node.js,express和mongodb的“公寓search器”应用程序。
注意事项
我读过下划线库对此很有帮助。
编辑:我的想法
所以,我有一个想法如何searchaddress_components
数组。 (我可以通过results[0]
访问它),我相信我可以通过点符号来访问types
数组,但是我想search每个对象的所有types
数组,然后返回find一个对象,比方说types
包含“位置”。 我怎样才能做到这一点?
我不是经验丰富的parsing/循环JSON。 我正在学。 任何帮助是极大的赞赏。 谢谢!
您可以使用嵌套的.filter
来获取包含该对象的对象,并结合使用.map
来创build一个匹配对象数组:
var objectsContainingConditions = data.results[0].address_components.filter(function(item) { return item.types.filter(function(addressType) { return addressType == "locality"; }).length > 0; }).map(function(item) { return { long: item.long_name, short: item.short_name } });
把它放到一个函数中,并且如果你想重用它,传递types:
function queryGoogleComponentsByType(type, components) { return components.filter(function(item) { return item.types.filter(function(addressType) { return addressType == type; }).length > 0; }).map(function(item) { return { long: item.long_name, short: item.short_name } }); } var results = queryGoogleComponentsByType("locality", data.results[0].address_components);
演示: http : //jsfiddle.net/upzjth30/
如果你想使用下划线,这里是一个解决scheme,将告诉你如何使用它的基元来实现你正在寻找的结果
这将查找具有“局部性”types的第一个组件
var result = _.chain(json.results) .pluck('address_components') .flatten() .find(function(component) { return _.contains(component.types, 'locality'); }) .pick('long_name', 'short_name') .value()
演示: https : //jsfiddle.net/x9520bkx/
for (var i = 0; i < data.results[0].address_components.length; i++) { alert(data.results[0].address_components[i].short_name); }