【问题标题】:How Can I Get the Navigation Path of a Node in a JSON Tree While Iterating Through the Tree如何在遍历树时获取 JSON 树中节点的导航路径
【发布时间】:2016-10-22 15:00:07
【问题描述】:

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'记录的'name'和'value'部分,但是我怎样才能在这个函数中完成'path'部分呢?

欢迎任何解决方法。谢谢!

【问题讨论】:

    标签: javascript json iteration


    【解决方案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));

    【讨论】:

    • 一个是,您添加了一个我无法提供的新参数“搜索”。另一个是结果不是我们想要的。
    • 它是 d 系列。问题是只在分支末端获取路径吗?
    • 其实最里面的节点永远是一个字符串,被某个对象包裹起来。而且由于某种原因,字符串节点并不总是处于相同的深度。
    • 而且由于某种原因,字符串节点并不总是处于相同的深度。
    • 太棒了!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多