给定一组JSON对象,如何根据嵌套值获取JSON对象X?

时间:2015-05-11 22:11:45

标签: javascript arrays json node.js parsing

我正在使用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_nameaddress_components

实施例

我希望得到long_name数组中short_name的{​​{1}} "locality"个对象。

上下文

我使用这些信息来建立一个"公寓发现者"使用node.js,express和mongodb的应用程序。

考虑

我读过下划线库对此有好处。

编辑:我的想法

所以,我知道如何搜索types数组。 (我可以通过address_components)访问它,我相信我可以通过点表示法访问results[0]数组,但我想搜索每个对象的所有types数组并在我返回时返回找一个对象,让我们说types包含' location'。我怎么能这样做?

我没有经验丰富的解析/循环JSON。我在学习。任何帮助是极大的赞赏。谢谢!

3 个答案:

答案 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();

演示:http://jsfiddle.net/upzjth30/

答案 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()

演示:https://jsfiddle.net/x9520bkx/

答案 2 :(得分:-2)

for (var i = 0; i < data.results[0].address_components.length; i++) {
    alert(data.results[0].address_components[i].short_name);
}