返回嵌套集合中对象的最大深度 (JavaScript)

Return the Maximum Depth of objects in a Nested Collection (JavaScript)

提问人:Alster 提问时间:3/10/2023 最后编辑:Alster 更新时间:3/10/2023 访问量:33

问:

我正在寻找一种合适的算法,该算法将返回集合层次结构中对象集合的最大深度。我有一个根对象,它可能包含也可能不包含相同类型的可变数对象的集合。这些子对象中的每一个,本身都可能包含相同类型和变量数的集合,依此类推,直至任何深度。(见图)。

Object hierarchy

我正在寻找最好的算法,该算法将返回一个整数,该整数表示层次结构中最深集合的级别。(所以在我的图中,这将是 4。

我已经递归地尝试了以下函数,但它总是被一个淘汰。

 var getLevelFunc = function (children) {
             var depth = 0
            for (var c = 0; c < children.length; c++) {
                let child= children[c];
                if (child.children() != null && child.children().length > 0) {
                    var tempDepth = getLevelFunc(child.children());
                    if (tempDepth > depth) {
                        depth = tempDepth
                    }
                }
            }
            return 1 + depth;
        }

非常感谢

JavaScript 递归 集合 嵌套最大

评论

0赞 Ben Stephens 3/10/2023
如果它总是出一个,你能从总数中添加或删除一个吗?您首先要向 getLevelFunc 传递什么?

答:

1赞 Ben Stephens 3/10/2023 #1

我不是 100% 确定你所拥有的数据结构,所以我嘲笑了一个没有任何方法的更简单的结构,希望它仍然有意义。children()

我认为使您的解决方案更棘手的部分原因是您从子节点而不是节点开始,毕竟,如果您有一个没有子节点的节点,它仍然应该具有 1 的深度(如果我理解正确的话)。通过将深度传递到每个阶段,我认为它可能会更容易看到代码中应该发生什么。getLevelFunc

const tree = {
  name: 'root',
  children: [
    {
      name: 'Child 1',
      children: [
        { name: 'Child 1.1' },
        {
          name: 'Child 1.2',
          children: [
            { name: 'Child 1.2.1' },
            { name: 'Child 1.2.2' },
            { name: 'Child 1.2.3' },
          ]
        }
      ],
    },
    {
      name: 'Child 2',
      children: [
        { name: 'Child 2.1' },
        { name: 'Child 2.2' },
      ],
    },
    { name: 'Child 3' },
  ]
};

const getLevelFunc = function (node, start_depth = 1) {
  let depth = start_depth;
  
  for (const child of (node.children ?? []))
    depth = Math.max(depth, getLevelFunc(child, start_depth + 1));
  
  return depth;
};

console.log(getLevelFunc(tree));