遍历json节点

时间:2012-07-02 05:34:02

标签: javascript arrays json hash

是否可以遍历所有节点并从未预定级别的复杂json中找到所需字段

{
    "_index": "test",
    "_type": "news",
    "_source": {
        "partnerName": "propertyFile 9",
        "relatedSources": "null",
        "entityCount": "50",
        "Categories": {
            "Types": {
                "Events": [{
                    "count": 1,
                    "term": "Time",
                    "Time": [{
                        "term": "Dec 9",
                        "Dec_9": [{
                            "count": 1,
                            "term": "2012"
                        }]
                        }]
                    }, {
                    "count": 4,
                    "term": "News",
                    "News": [{
                        "term": "Germany",
                        "Germany": [{
                            "count": 1,
                            "term": "Election"
                        }],
                        "currency": "Euro (EUR)"
                    }, {
                        "term": "Egypt",
                        "Egypt": [{
                            "count": 1,
                            "term": "Revolution"
                        }]
                        }]
                    }]
                }
        }
    }
}

我可以进入第一级,如果第一级中没有字段名称,我该如何进入第二级。这就是我开始的方式。 http://jsfiddle.net/W8qhA/1/

3 个答案:

答案 0 :(得分:1)

我希望这能解决你的问题。有一些功能,也有一点解释。希望能帮到你。 Traverse all the Nodes of a JSON Object Tree with JavaScript

答案 1 :(得分:1)

我掀起了一个可以处理你所呈现的结构对象的函数。如果有多个同名的键,它将只返回它遇到的第一个键。

var findDeepKey = function(obj, key){
    var results = [];

    if (typeof obj !== 'object') return null;

    for (var k in obj) {
        if (k === key) return obj[k];
    }

    for (var k in obj) {
        if (typeof obj[k] === 'object') {
            if (obj[k].length) {
                for (var i = 0, il = obj[k].length; i < il; i++) {
                    results.push(findDeepKey(obj[k][i], key));
                }
            } else {
                for (var kk in obj[k]) {
                    if (kk === key) return obj[k][kk];
                    results.push(findDeepKey(obj[k][kk], key));
                }
            }
        }
    }

    for (var i = 0, il = results.length; i < il; i++) {
        if (results[i] !== null) return results[i];
    }

    return null;
};

See demo

答案 2 :(得分:0)