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

咨询:如何将树形结构对象转换为指定数组格式?

树形结构转指定扁平数组的实现思路与代码

当然可行,核心思路是先收集所有节点并建立ID到节点的映射,再筛选出叶子节点并替换parent字段为父节点名称。具体步骤如下:

  • 步骤1:遍历树形结构,收集所有节点并建立ID映射
    用递归或迭代方式遍历整个树形结构,把所有节点(包括父节点和叶子节点)存入一个以节点ID为键的对象中,后续可以快速通过parentID找到对应父节点的信息。

  • 步骤2:筛选叶子节点并转换格式
    遍历所有节点,找出_children为空的叶子节点,将每个节点转换成目标格式:

    • id从字符串转为数字类型
    • 直接保留name字段
    • parent字段替换为父节点的name(通过之前的ID映射表获取)

代码实现

// 原始树形数据
let mydata=[{
    "_children": {
        "5": {
            "_children": {
                "7": {
                    "_children": {},
                    "id": "7",
                    "name": "subject11",
                    "parentID": 5
                },
                "10": {
                    "_children": {},
                    "id": "10",
                    "name": "subject12",
                    "parentID": 5
                }
            },
            "id": "5",
            "name": "subject1",
            "parentID": null
        },
        "6": {
            "_children": {
                "8": {
                    "_children": {},
                    "id": "8",
                    "name": "subject21",
                    "parentID": 6
                },
                "9": {
                    "_children": {},
                    "id": "9",
                    "name": "subject22",
                    "parentID": 6
                }
            },
            "id": "6",
            "name": "subject2",
            "parentID": null
        }
    }
}]

// 转换函数
function transformTreeToFlatArray(data) {
    const nodeMap = {};
    
    // 递归遍历所有节点,填充ID映射表
    function traverse(node) {
        nodeMap[node.id] = node;
        // 遍历当前节点的所有子节点
        Object.values(node._children).forEach(child => traverse(child));
    }
    
    // 从根节点的子节点开始遍历
    data.forEach(root => {
        Object.values(root._children).forEach(child => traverse(child));
    });
    
    // 筛选叶子节点并转换为目标格式
    return Object.values(nodeMap)
        .filter(node => Object.keys(node._children).length === 0)
        .map(node => {
            const parentNode = nodeMap[node.parentID];
            return {
                id: Number(node.id),
                name: node.name,
                parent: parentNode ? parentNode.name : ''
            };
        });
}

// 执行转换并输出结果
let endresult = transformTreeToFlatArray(mydata);
console.log(endresult);

代码说明

  • traverse递归函数负责遍历所有层级的节点,将每个节点存入nodeMap,确保后续可以通过ID快速查找父节点。
  • 最后通过filter筛选出无子女的叶子节点,再用map完成格式转换,其中parent字段直接从映射表中获取父节点的名称。

执行上述代码后,输出结果与你给出的Format2完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 11:20:56