咨询:如何将树形结构对象转换为指定数组格式?
树形结构转指定扁平数组的实现思路与代码
当然可行,核心思路是先收集所有节点并建立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
相关产品推荐
相关产品推荐

