2012-11-23 19 views
8

Değişken derinliğe sahip bir izin sistemi üzerinde çalışıyorum; Bir sayfanın karmaşıklığına bağlı olarak, daha fazla veya daha az seviye olabilir. Daha önce sorulmuş olup olmadığını bulmak için StackOverflow'u aradım, bulamadım. Ben bu nesneyi varsaBir nesnenin derinliği nasıl kontrol edilir?

:

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

Ben 3 dönmek gerekir, bunun için 3 seviyesi vardır. Bu nesne ile

:

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

sorundur çok kardeş elemanlarını sayar:

{abc: 'xyz'} 

O Bu defa ne var 1.

olması gerekir. Aslında derinlik kazanmıyor, bir nesnenin tüm üyelerini sayıyor.

cevap

16

İşte burada, arkadaşınıza gidin, tam olarak ihtiyacınız olan şeyi yapan bir işlev!

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

Düşündüğümüzden çok daha kolay. Sorun nasıl artırıldığına göre, en üste çıkıp bir tane ekleyerek, ardından iki kardeş arasındaki maksayı seçerek, tekrarlı olarak eklenmemeliydi.

+0

Bu işlevdeki "düzey" argümanı nedir? –

+0

utils.depthOf ({}) 'deyimi ile çağrılırdı - ikinci parametre yalnızca özyineleme için kullanılır, bu yüzden ikinci satırın söylediği şeydir" Seviye yanlışsa seviye eşittir seviyesi, eğer seviye yanlışsa, seviye bir " –

+1

Bir yana, bu işlev aslında çalışmıyor. Kardeş elemanlar varsa, onları "genişlik" yerine derinlik olarak sayar. - Hala üzerinde çalışıyorum. –

İlgili konular