2012-11-23 12 views
8

Sto lavorando su un sistema di permessi con profondità variabile; a seconda della complessità di una pagina, potrebbero esserci più o meno livelli. Ho cercato StackOverflow per scoprire se questo è stato chiesto prima, non riuscivo a trovarlo.Come verificare la profondità di un oggetto?

Se ho questo oggetto:

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

ho bisogno di tornare 3, dispone di 3 livelli ad esso.

Con questo oggetto:

{abc: 'xyz'} 

Dovrebbe essere 1.

Questo è quello che ho finora:

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

Il problema è che conta elementi sorella troppo. In realtà non sta ottenendo profondità, sta contando tutti i membri di un oggetto.

risposta

16

Bene, qui vai amico, una funzione che fa esattamente ciò di cui hai bisogno!

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

Molto più facile di quanto pensassimo. Il problema era come è stato incrementato, non dovrebbe essere stato aggiunto in modo ricorsivo, piuttosto ottenere il punto più basso e aggiungerne uno, quindi scegliere il massimo tra due fratelli.

+0

Qual è l'argomento "livello" in questa funzione? –

+0

Si chiamerebbe 'utils.depthOf ({})' - il secondo parametro è usato solo per la ricorsione, motivo per cui la seconda riga sta dicendo "il livello è uguale al livello se il livello non è falso, se il livello è falso, il livello è uno " –

+1

A parte questo, questa funzione in realtà non funziona. Se ci sono elementi secondari, li conta come profondità piuttosto che come "larghezza". - Ci sto ancora lavorando. –

Problemi correlati