如何检查物体的深度?

Kav*_*gel 13 javascript recursion object

我正在研究一个具有可变深度的权限系统; 根据页面的复杂程度,可能会有更多或更少的级别.我搜索了StackOverflow,发现之前是否有人问过,找不到它.

如果我有这个对象:

{foo:{bar:{baz : 'baa'}}}
Run Code Online (Sandbox Code Playgroud)

我需要它返回3,它有3个级别.

有了这个对象:

{abc: 'xyz'} 
Run Code Online (Sandbox Code Playgroud)

它必须是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;
}
Run Code Online (Sandbox Code Playgroud)

问题是它也算姐妹元素.它实际上没有得到深度,它正在计算一个对象的所有成员.

Kav*_*gel 25

嗯,在这里你去哥们,一个完全符合你需要的功能!

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;
}
Run Code Online (Sandbox Code Playgroud)

比我们想象的容易得多.问题是它是如何递增的,它不应该是递归地添加,而是获得最底层并添加一个,然后选择两个兄弟之间的最大值.

  • 除此之外,此功能实际上不起作用。如果有姐妹元素,它会将它们算作深度而不是“宽度”。- 我还在努力。 (2认同)

Sco*_*yet 7

这个老问题最近又复活了,我没有看到任何像这个这样简单的答案(公平地说,这使用了编写问题时不可用的技术):

const objectDepth = (o) =>
  Object (o) === o ? 1 + Math .max (-1, ... Object .values(o) .map (objectDepth)) : 0

console .log (objectDepth ({foo: {bar: {baz: 'baa'}}}))
console .log (objectDepth ({abc: 'xyz'}))
Run Code Online (Sandbox Code Playgroud)

就像这里的大多数答案一样,当输入对象是循环时,这将会失败。解决这一限制的答案需要更加复杂。