8

この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
            }]
        }]
    }] 
}
4

2 に答える 2

31

再帰関数を使用して、ツリー全体を調べることができます。

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
}

関数は次のように機能します。

  • オブジェクトがリーフでない場合 (つまり、オブジェクトに children 属性がある場合)、次のようになります。
    • 各子の深さを計算し、最大のものを保存します
    • 1 + 最も深い子の深さを返す
  • それ以外の場合は 1 を返す

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

編集 最新の JavaScript では、関数は次のようになります。

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

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

于 2013-04-18T06:29:28.413 に答える
3

これは、ツリーの「葉」の数をカウントします。

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

深さを取得する別の方法:

var depthCount = function (branch) {
    if (!branch.children) {
        return 1;
    }
    return 1 + d3.max(branch.children.map(depthCount));
 }
于 2013-04-18T06:33:41.647 に答える