2013-04-18 64 views
5

私は、このJSONファイルを解析し、その子の全体の深さを取得する再帰関数を見つけたり構築したりするのに苦労してきました。未知の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 
      }] 
     }] 
    }] 
} 
+0

をあなたは結果が欲しいですか? – minikomi

答えて

17

あなたは、ツリー全体を通過する再帰関数を使用することができます:

ファイルには、次のようになります

  • :関数は次のように動作します

    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

    jsFiddle返し、そうでない場合は最大1つの

  • リターン1 +最深の子供
  • の深さを保存します。http://jsfiddle.net/chrisJamesC/hFTN8/

    を編集 現代のJavaScriptの場合、関数は次のようになります:

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

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

  • +0

    文字通り未知のJSONの深さを取得したり、あらゆる種類のJSONで再利用できるようにするにはどうすればいいですか?私は、JSON要素を "子"と呼ぶ必要があると想定しています。たとえば、JSON要素が「子」の場合は機能しません。 1つのJSONに「飛行」があり、もう1つに「鳥」がある場合は、「子供」の代わりに「車」を使用します。 –

    +0

    constが私に与えますTypeError: 'undefined'または 'null'と照合できません。 –

    2

    これは、ツリー内の "葉" の数をカウントします:

    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)); 
    } 
    
    +0

    'if(!branch.children)'を意味しますか? –

    +0

    はい、良いキャッチありがとう! – minikomi