如何获得未知JSON层次结构的总深度?

jfk*_*k83 7 javascript json nested d3.js

我一直在努力寻找/构建一个递归函数来解析这个JSON文件并获得其子项的总深度.

该文件看起来像这样:

var input = {
    "name": "positive",
    "children": [{
        "name": "product service",
        "children": [{
            "name": "price",
            "children": [{
                "name": "cost",
                "size": 8
            }]
        }, {
            "name": "quality",
            "children": [{
                "name": "messaging",
                "size": 4
            }]
        }]
    }, {
        "name": "customer service",
        "children": [{
            "name": "Personnel",
            "children": [{
                "name": "CEO",
                "size": 7
            }]
        }]
    }, {
        "name": "product",
        "children": [{
            "name": "Apple",
            "children": [{
                "name": "iPhone 4",
                "size": 10
            }]
        }]
    }] 
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*che 25

您可以使用递归函数遍历整个树:

getDepth = function (obj) {
    var depth = 0;
    if (obj.children) {
        obj.children.forEach(function (d) {
            var tmpDepth = getDepth(d)
            if (tmpDepth > depth) {
                depth = tmpDepth
            }
        })
    }
    return 1 + depth
}
Run Code Online (Sandbox Code Playgroud)

该功能的工作原理如下:

  • 如果对象不是叶子(即对象具有children属性),则:
    • 计算每个孩子的深度,保存最大的孩子
    • 返回1 +最深的孩子的深度
  • 否则,返回1

jsFiddle:http://jsfiddle.net/chrisJamesC/hFTN8/

编辑 使用现代JavaScript,函数可能如下所示:

const getDepth = ({ children }) => 1 +
    (children ? Math.max(...children.map(getDepth)) : 0)
Run Code Online (Sandbox Code Playgroud)

jsFiddle:http://jsfiddle.net/chrisJamesC/hFTN8/59/

  • 这如何用于获取字面上未知的 JSON 的深度,或使其可重用于任何类型的 JSON?我认为这需要将 JSON 元素称为“子项”,如果它们是例如,它将不起作用。“汽车”而不是“儿童”,或者当一个 JSON 有“苍蝇”而另一个有“鸟”时。 (3认同)