我正在使用google maps 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"
]
}
]
}
]
}
如何根据特定类型获取long_name
数组中对象的short_name
和address_components
?
我希望得到long_name
数组中short_name
的{{1}} 和 "locality"
个对象。
我使用这些信息来建立一个"公寓发现者"使用node.js,express和mongodb的应用程序。
我读过下划线库对此有好处。
所以,我知道如何搜索types
数组。 (我可以通过address_components
)访问它,我相信我可以通过点表示法访问results[0]
数组,但我想搜索每个对象的所有types
数组并在我返回时返回找一个对象,让我们说types
包含' location'。我怎么能这样做?
我没有经验丰富的解析/循环JSON。我在学习。任何帮助是极大的赞赏。谢谢!
答案 0 :(得分:3)
您可以使用嵌套的.map
来获取包含该对象的对象,并结合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
}
});
来创建匹配对象的数组:
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);
将它放入一个函数中并传递该类型,如果你想重用它:
camera.startPreview();
camera.unlock();
recorder = new MediaRecorder();
recorder.setCamera(camera);
recorder.setVideoSource(MediaRecorder.VideoSource.DEFAULT);
recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4);
recorder.setVideoFrameRate(24);
recorder.setVideoEncodingBitRate(3000000);
recorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264);
recorder.setOutputFile(output.getAbsolutePath());
recorder.setPreviewDisplay(holder.getSurface());
recorder.prepare();
recorder.start();
camera.stopPreview();
Camera.Parameters cameraParameters = camera.getParameters();
cameraParameters.setPreviewSize(x, y);
camera.setParameters(cameraParameters);
camera.startPreview();
recorder.stop();
recorder.reset();
recorder.release();
recorder = null;
camera.lock();
camera.stopPreview();
答案 1 :(得分:0)
如果你想使用下划线,这里有一个解决方案,它将告诉你如何使用它的原语来实现你正在寻找的结果
这将查找具有“locality”类型的第一个组件
var result = _.chain(json.results)
.pluck('address_components')
.flatten()
.find(function(component) {
return _.contains(component.types, 'locality');
})
.pick('long_name', 'short_name')
.value()
答案 2 :(得分:-2)
for (var i = 0; i < data.results[0].address_components.length; i++) {
alert(data.results[0].address_components[i].short_name);
}