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

如何将层级数据数组转换为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:57:00