2012-11-23 4 views
8

私は、可変深度のパーミッションシステムに取り組んでいます。ページの複雑さにもよりますが、多かれ少なかれレベルが存在する可能性があります。私はStackOverflowを検索してこれが以前に尋ねられたかどうかを調べ、見つからなかった。オブジェクトの深さを確認する方法は?

私は、このオブジェクトがある場合:

{foo:{bar:{baz : 'baa'}}} 

を、私はそれが3を返す必要が、それはそれに3つのレベルがあります。このオブジェクトに

{abc: 'xyz'} 

それは1

でなければならないであろうこれは私がこれまで持っているものです。

utils.depthOf = function(object, level){ 
    // Returns an int of the deepest level of an object 
    level = level || 1; 

    var key; 
    for(key in object){ 
     if (!object.hasOwnProperty(key)) continue; 

     if(typeof object[key] == 'object'){ 
      level++; 
      level = utils.depthOf(object[key], level); 
     } 
    } 

    return level; 
} 

問題は、それがあまりにも姉妹要素をカウントしています。それは実際には深みを得ることはありません、それはオブジェクトのすべてのメンバーを数えています。

答えて

16

まあ、ここであなたはバディー、あなたが必要とするものを正確に行う機能に行く!

utils.depthOf = function(object) { 
    var level = 1; 
    var key; 
    for(key in object) { 
     if (!object.hasOwnProperty(key)) continue; 

     if(typeof object[key] == 'object'){ 
      var depth = utils.depthOf(object[key]) + 1; 
      level = Math.max(depth, level); 
     } 
    } 
    return level; 
} 

私たちは思ったよりずっと簡単でした。問題はそれがどのように増加したか、再帰的に追加するべきではなく、最下位を取得して追加し、2つの兄弟の間の最大値を選択することでした。

+0

この関数の引数 "level"とは何ですか? –

+0

これは、 'utils.depthOf({}) 'と呼ばれて呼び出されます.2番目のパラメータは再帰にのみ使用されるため、2行目は" levelがfalseでない場合はlevelと等しくなります。レベルは1です " –

+1

それ以外のところ、この関数は実際には機能しません。姉妹要素がある場合、それは「幅」ではなく深度としてカウントされます。 - 私はまだそれに取り組んでいます。 –