2012-11-23 16 views
8

Ich arbeite an einem Berechtigungssystem mit variabler Tiefe; Abhängig von der Komplexität einer Seite kann es mehr oder weniger Ebenen geben. Ich habe StackOverflow gesucht, um herauszufinden, ob dies schon einmal gefragt wurde, konnte es nicht finden.Wie überprüft man die Tiefe eines Objekts?

Wenn ich dieses Objekt haben:

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

Ich brauche es 3 zurückzukehren, hat es 3 Ebenen zu.

Mit diesem Objekt:

{abc: 'xyz'} 

Es wäre 1.

Dies ist sein müssen, was ich habe, so weit:

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

Das Problem ist, zählt es Schwester Elemente zu. Es wird nicht wirklich Tiefe, es zählt alle Mitglieder eines Objekts.

Antwort

16

Nun, hier gehen Sie Kumpel, eine Funktion, die genau das tut, was Sie brauchen!

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

viel einfacher, als wir dachten, es wäre. Das Problem war, wie es inkrementiert wurde, es hätte nicht rekursiv hinzugefügt werden sollen, sondern eher das unterste und das Hinzufügen eines, dann die Wahl zwischen zwei Geschwistern.

+0

Was ist das Argument "level" in dieser Funktion? –

+0

Es würde mit 'utils.depthOf ({})' heißen - der zweite Parameter wird nur für die Rekursion benutzt, weshalb die zweite Zeile sagt "level is level wenn level nicht false ist, level ist false, Level ist eins " –

+1

Abgesehen davon funktioniert diese Funktion nicht wirklich. Wenn es Schwesterelemente gibt, werden sie als Tiefe und nicht als "Breite" gezählt. - Daran arbeite ich noch. –

Verwandte Themen