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

如何获取树形结构的所有路径数组?

如何获取树形结构的所有路径数组?

本例中需要生成的5种路径格式如下:

[
  [{ 1: "2" }, { 3: "4" }],
  [{ 1: "2" }, { 3: "5" }],
  [{ 1: "6" }, { 7: "8" }],
  [{ 1: "6" }, { 7: "9" }, { 10: "11" }],
  [{ 1: "6" }, { 7: "9" }, { 10: "12" }],
]

对应的树形结构示意图:
树形结构示意图

你尝试用递归遍历嵌套对象,但无法生成上述格式的数组,当前代码如下:

const data = {
  "1": {
    "2": {
      "3": {
        "4": {},
        "5": {}
      }
    },
    "6": {
      "7": {
        "8": {},
        "9": {
          "10": {
            "11": {},
            "12": {}
          }
        }
      }
    }
  }
}

let list = [];

function iterate(object) {
    if( object !== null && typeof object == "object" ) {
        Object.entries(object).forEach(([key, value]) => {
            if( JSON.stringify(value) != JSON.stringify({})) {
                let obj = {};
                obj[key] = Object.keys(value)
                list.push(obj);
                iterate(value);
            }
        });
    }
}

iterate(data);

当前代码运行结果示意图:
代码运行结果示意图


解决方案

当前代码的问题在于仅收集了单个节点,没有追踪完整路径。要生成目标格式,需要在递归时维护当前路径,遍历到叶子节点时将完整路径存入结果数组。调整后的代码如下:

const data = {
  "1": {
    "2": {
      "3": {
        "4": {},
        "5": {}
      }
    },
    "6": {
      "7": {
        "8": {},
        "9": {
          "10": {
            "11": {},
            "12": {}
          }
        }
      }
    }
  }
}

const result = [];

function traverse(obj, currentPath) {
  Object.entries(obj).forEach(([key, value]) => {
    // 生成当前节点:{父键: 子键}
    const node = { [key]: Object.keys(value)[0] };
    const newPath = [...currentPath, node];
    
    // 判断当前节点是否是叶子节点的父节点(子节点为空对象)
    const hasLeafChildren = Object.values(value).every(child => Object.keys(child).length === 0);
    
    if (hasLeafChildren) {
      // 为每个叶子节点生成完整路径
      Object.keys(value).forEach(childKey => {
        const leafNode = { [Object.keys(value)[0]]: childKey };
        result.push([...newPath.slice(0, -1), leafNode]);
      });
    } else {
      // 继续递归遍历子节点
      traverse(value, newPath);
    }
  });
}

// 初始调用,从根节点开始,当前路径为空
traverse(data, []);

console.log(result);

关键逻辑说明

  • 递归函数traverse通过currentPath参数实时追踪当前已遍历的路径节点。
  • 每次遍历键值对时,生成符合要求的节点格式,并更新路径。
  • 识别叶子节点的父节点:当某个节点的所有子节点都是空对象时,说明该节点的子节点是路径终点,此时为每个子节点生成完整路径并加入结果数组。
  • 非叶子节点则继续递归深入,直到遍历到所有路径终点。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 07:20:49