如何将层级数据数组转换为D3-Tree-Region适配的JSON格式
解决方案:将扁平层级数组转换为D3树结构所需的嵌套JSON
我们可以通过构建节点映射表+关联父子节点的方式完成转换,以下是适配你数据结构的JavaScript实现:
function flatToNestedTree(flatData) { // 创建节点映射表,用CHILD_ID作为键快速查找节点 const nodeMap = {}; let rootNode = null; // 第一步:初始化每个节点的children数组,并加入映射表 flatData.forEach(node => { const newNode = {...node, children: []}; nodeMap[node.CHILD_ID] = newNode; // 标记根节点(PARENT_ID为0的节点) if (node.PARENT_ID === 0) { rootNode = newNode; } }); // 第二步:遍历节点,将每个节点挂载到其父节点的children数组中 flatData.forEach(node => { const parentNode = nodeMap[node.PARENT_ID]; // 排除根节点本身(它的PARENT_ID是0,无对应父节点在映射表中) if (parentNode && node.PARENT_ID !== 0) { parentNode.children.push(nodeMap[node.CHILD_ID]); } }); return rootNode; } // 你的扁平数组数据 const flatArray = [ {"PARENT_ID": 0,"CHILD_ID": 1,"NAME": "Quality","LEVEL_A": 0}, {"PARENT_ID": 1,"CHILD_ID": 2,"NAME": "Machine","LEVEL_A": 1}, {"PARENT_ID": 1,"CHILD_ID": 3,"NAME": "Method","LEVEL_A": 1}, {"PARENT_ID": 1,"CHILD_ID": 4,"NAME": "Material","LEVEL_A": 1}, {"PARENT_ID": 1,"CHILD_ID": 5,"NAME": "Man Power","LEVEL_A": 1}, {"PARENT_ID": 1,"CHILD_ID": 6,"NAME": "Measurement","LEVEL_A": 1}, {"PARENT_ID": 1,"CHILD_ID": 7,"NAME": "Milieu","LEVEL_A": 1}, {"PARENT_ID": 1,"CHILD_ID": 10,"NAME": "Metal Lathe","LEVEL_A": 1}, {"PARENT_ID": 2,"CHILD_ID": 3,"NAME": "dasd","LEVEL_A": 2}, {"PARENT_ID": 2,"CHILD_ID": 8,"NAME": "Mill","LEVEL_A": 2}, {"PARENT_ID": 2,"CHILD_ID": 9,"NAME": "Mixer","LEVEL_A": 2}, {"PARENT_ID": 4,"CHILD_ID": 11,"NAME": "Masonite","LEVEL_A": 2}, {"PARENT_ID": 4,"CHILD_ID": 12,"NAME": "Meat","LEVEL_A": 2}, {"PARENT_ID": 4,"CHILD_ID": 13,"NAME": "Marscapone","LEVEL_A": 2}, {"PARENT_ID": 5,"CHILD_ID": 20,"NAME": "Manager","LEVEL_A": 2}, {"PARENT_ID": 5,"CHILD_ID": 21,"NAME": "Magician","LEVEL_A": 2}, {"PARENT_ID": 5,"CHILD_ID": 22,"NAME": "Magister","LEVEL_A": 2}, {"PARENT_ID": 5,"CHILD_ID": 24,"NAME": "Massage Artist","LEVEL_A": 2}, {"PARENT_ID": 6,"CHILD_ID": 25,"NAME": "Malleability","LEVEL_A": 2}, {"PARENT_ID": 7,"CHILD_ID": 26,"NAME": "Marine","LEVEL_A": 2}, {"PARENT_ID": 12,"CHILD_ID": 19,"NAME": "Mutton","LEVEL_A": 3}, {"PARENT_ID": 13,"CHILD_ID": 14,"NAME": "Malty","LEVEL_A": 3}, {"PARENT_ID": 13,"CHILD_ID": 15,"NAME": "Minty","LEVEL_A": 3}, {"PARENT_ID": 14,"CHILD_ID": 17,"NAME": "Minty","LEVEL_A": 4}, {"PARENT_ID": 17,"CHILD_ID": 16,"NAME": "spearMint","LEVEL_A": 5}, {"PARENT_ID": 17,"CHILD_ID": 18,"NAME": "pepperMint","LEVEL_A": 5}, {"PARENT_ID": 22,"CHILD_ID": 23,"NAME": "Malpractice","LEVEL_A": 3} ]; // 转换并输出结果 const nestedTree = flatToNestedTree(flatArray); console.log(JSON.stringify(nestedTree, null, 2));
代码说明
- 节点映射表:用
nodeMap将每个节点的CHILD_ID作为键,实现O(1)时间复杂度的节点查找,避免多层嵌套遍历的性能损耗。 - 初始化children数组:为每个节点添加空的
children数组,确保最终结构符合D3树组件的要求。 - 关联父子节点:遍历每个节点,通过
PARENT_ID匹配映射表中的父节点,将当前节点推入父节点的children数组。 - 根节点处理:直接标记
PARENT_ID为0的节点作为树的根节点,返回该节点即可得到完整嵌套结构。
注:你提供的示例目标结构中,PARENT_ID:2, CHILD_ID:3的节点NAME从dasd变成了Banana,上述代码会保留原数据中的NAME值,如有需要可在初始化节点时单独修改。
内容的提问来源于stack exchange,提问作者Jegor Wieler
相关产品推荐
相关产品推荐

