22

私は可変深さの権限システムに取り組んでいます。ページの複雑さに応じて、レベルが増減する可能性があります。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;
}

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

4

6 に答える 6

32

さて、これはまさにあなたが必要とする機能を実行する機能です!

utils.depthOf = function(object) {
    var level = 1;
    for(var 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;
}

思ったよりずっと簡単です。問題は、それがどのようにインクリメントされるかでした。再帰的に追加するべきではなく、一番下のものを取得して 1 つ追加し、次に 2 つの兄弟間の最大値を選択する必要がありました。

于 2012-11-23T06:14:54.040 に答える