You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript:求嵌套集合对象的最大深度

嵌套集合最大深度计算修正方案

你的递归函数结果总是差1,核心原因是计数起始点和实际需求的层级定义不匹配:

假设示例中最深路径是「根节点 → 子节点1 → 子节点2 → 子节点3」(共4层),你当前调用函数时传入的是根节点.children(),但函数会把这些子节点当作第1层开始计数,最终得到3,比实际期望的4少1。

修正方案1:调整函数接收单个节点(推荐)

修改函数,让它从单个节点开始递归计数,把当前节点本身算入层级:

var getLevelFunc = function(node) {
    // 没有子节点时,当前节点自身就是1层
    if (!node.children() || node.children().length === 0) {
        return 1;
    }
    var maxChildDepth = 0;
    for (var c = 0; c < node.children().length; c++) {
        var childDepth = getLevelFunc(node.children()[c]);
        if (childDepth > maxChildDepth) {
            maxChildDepth = childDepth;
        }
    }
    // 当前节点的层级 = 子节点最大深度 + 1
    return maxChildDepth + 1;
}

调用方式:传入根节点 getLevelFunc(rootNode),即可得到正确的深度值(比如示例中的4)。

修正方案2:保留原函数参数,调用时补全根节点层级

如果必须保持函数接收节点集合的形式,只需在调用结果上加1(把根节点的层级补上):

// 原函数不变
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;
}

// 调用时补加根节点层级
var totalDepth = getLevelFunc(rootNode.children()) + 1;

原理说明

原函数的计数逻辑是:传入的节点集合中的每个节点,其层级为「子树深度 + 1」,但这个计数是从传入的节点开始的,没有包含它们的父节点(也就是根节点)。所以要么修改函数从单个节点开始计数,要么在调用时手动补上根节点的1层。

内容的提问来源于stack exchange,提问作者Alster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 17:45:23