如何在树中迭代时获取JSON树中节点的导航路径

时间:2016-06-21 07:26:34

标签: javascript json iteration

JSON摘录:

{
    "a": {
        "b1" : {
            "c1" : {
                "d1" : "D1",
                "d2" : "D2",
                "d3" : "D3"
            },
            "c2" : {
                "d4" : "D4",
                "d5" : "D5"
            }
        },
        "b2" : {
            "c3" : {
                "d6" : D6
            }
        }
    }
}

我想迭代JSON树并获得一个' d'系列值与每个' d'的导航路径节点,例如

[{'name': 'd1', 'value': 'D1', 'path': ['a', 'b1', 'c1']},...]

在这里,我写了一个函数如下:

        function GetParameters(obj) {
            for (var sProp in obj) {
                if(typeof(obj[sProp]) == "string") {
                    parameters.push({'name':sProp,'value':obj[sProp]})                                      
                } else {
                    GetParameters(obj[sProp]);                              
                }
            }               
        }

此功能仅生成'名称'和'价值'每个部分都有' d'记录,但我怎样才能获得路径'部分完成这个功能?

欢迎任何变通方法。谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用迭代和递归方法为下一次递归提供实际路径。

如果找到了结束节点,则会将新对象推送到具有受访节点的结果数组。



function getPath(object) {

    function iter(o, path) {
        Object.keys(o).forEach(function (k) {
            if (typeof o[k] === 'object') {
                return iter(o[k], path.concat(k));
            }
            result.push({ name: k, value: o[k], path: path });
        });
    }

    var result = [];
    iter(object, []);
    return result;
}

var data = { "a": { "b1": { "c1": { "d1": "D1", "d2": "D2", "d3": "D3" }, "c2": { "d4": "D4", "d5": "D5" } }, "b2": { "c3": { "d6": "D6" } } } };

console.log(getPath(data));