最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How to get the total depth of an unknown JSON hierarchy? - Stack Overflow

programmeradmin1浏览0评论

I've been struggling to find/build a recursive function to parse this JSON file and get the total depth of its children.

The file looks something like this:

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
            }]
        }]
    }] 
}

I've been struggling to find/build a recursive function to parse this JSON file and get the total depth of its children.

The file looks something like this:

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
            }]
        }]
    }] 
}
Share Improve this question edited Apr 5, 2016 at 15:20 nikoshr 33.3k34 gold badges94 silver badges109 bronze badges asked Apr 18, 2013 at 6:08 jfk83jfk83 8104 gold badges16 silver badges32 bronze badges 1
  • In what form would you like the result to be? – minikomi Commented Apr 18, 2013 at 6:17
Add a comment  | 

2 Answers 2

Reset to default 33

You can use a recursive function to go through the whole tree:

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
}

The function works as follow:

  • If the object is not a leaf (i.e the object has the children attribute), then:
    • Compute the depth of each child, save the maximal one
    • return 1 + the depth of the deepest child
  • Otherwise, return 1

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

EDIT With modern JavaScript, the function could look like this:

const getDepth = ({ children }) => 1 +
    (children ? Math.max(...children.map(getDepth)) : 0)

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

This will count the number of "leaves" in a tree:

var treeCount = function (branch) {
    if (!branch.children) {
        return 1;
    }
    return branch.children.reduce(function (c, b) {
        return c + treeCount(b);
    }, 0)
}

And an alternative way to get depth:

var depthCount = function (branch) {
    if (!branch.children) {
        return 1;
    }
    return 1 + d3.max(branch.children.map(depthCount));
 }
发布评论

评论列表(0)

  1. 暂无评论