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

JavaScript 基于DEPENDENCY字段实现任意深度的对象数组嵌套

问题描述

现有一份扁平结构的对象数组,需要将其转换为嵌套层级结构,对象的嵌套深度由DEPENDENCY属性定义,拆分该属性值即可得到对应的嵌套层级。

原始输入数据

const initArray = [
  { NAME: "initArray", DEPENDENCY: "0", VAR1: "VAR1", VAR2: "VAR2" },
  { NAME: "initArray2", DEPENDENCY: "0.0", VAR1: "VAR1", VAR2: "VAR2" },
  { NAME: "initArray3", DEPENDENCY: "0.1", VAR1: "VAR1", VAR2: "VAR2" },
  { NAME: "initArray4", DEPENDENCY: "0.0.0", VAR1: "VAR1", VAR2: "VAR2" },
  { NAME: "initArray5", DEPENDENCY: "0.0.1", VAR1: "VAR1", VAR2: "VAR2" },
  { NAME: "initArray6", DEPENDENCY: "0.0.2", VAR1: "VAR1", VAR2: "VAR2" },
  { NAME: "initArray7", DEPENDENCY: "0.1.1", VAR1: "VAR1", VAR2: "VAR2" },
  { NAME: "initArray8", DEPENDENCY: "0.1.2", VAR1: "VAR1", VAR2: "VAR2" },
  { NAME: "initArray9", DEPENDENCY: "0.1.3", VAR1: "VAR1", VAR2: "VAR2" },
  { NAME: "initArray10", DEPENDENCY: "0.1.4", VAR1: "VAR1", VAR2: "VAR2" },
  { NAME: "initArray11", DEPENDENCY: "0.1.5", VAR1: "VAR1", VAR2: "VAR2" },
];

期望输出结果

const myArray = [
  {
    NAME: "initArray",
    DEPENDENCY: "0",
    VAR1: "VAR1",
    VAR2: "VAR2",
    CHILDREN: [
      {
        NAME: "initArray2",
        DEPENDENCY: "0.0",
        VAR1: "VAR1",
        VAR2: "VAR2",
        CHILDREN: [
          {
            NAME: "initArray4",
            DEPENDENCY: "0.0.0",
            VAR1: "VAR1",
            VAR2: "VAR2",
          },
          {
            NAME: "initArray5",
            DEPENDENCY: "0.0.1",
            VAR1: "VAR1",
            VAR2: "VAR2",
          },
          {
            NAME: "initArray6",
            DEPENDENCY: "0.0.2",
            VAR1: "VAR1",
            VAR2: "VAR2",
         },
       ],
     },
     {
       NAME: "initArray3",
       DEPENDENCY: "0.1",
       VAR1: "VAR1",
       VAR2: "VAR2",
       CHILDREN: [
         {
           NAME: "initArray7",
           DEPENDENCY: "0.1.1",
           VAR1: "VAR1",
           VAR2: "VAR2",
         },
         {
           NAME: "initArray8",
           DEPENDENCY: "0.1.2",
           VAR1: "VAR1",
           VAR2: "VAR2",
         },
         {
           NAME: "initArray9",
           DEPENDENCY: "0.1.3",
           VAR1: "VAR1",
           VAR2: "VAR2",
         },
         {
           NAME: "initArray10",
           DEPENDENCY: "0.1.4",
           VAR1: "VAR1",
           VAR2: "VAR2",
         },
         {
           NAME: "initArray11",
           DEPENDENCY: "0.1.5",
           VAR1: "VAR1",
           VAR2: "VAR2",
         },
       ],
     },
   ],
  },
];

现有实现的局限性

当前已实现的固定层级转换代码仅支持最多3层嵌套,每增加一层都需要手动新增对应的if判断逻辑,无法适配任意深度的嵌套需求。

通用解决方案

实现思路

通过层级指针遍历的方式,沿着DEPENDENCY拆分后的索引路径逐步定位到当前节点的父级容器,自动创建不存在的CHILDREN数组,无需手动判断层级深度,可支持任意层嵌套。

实现代码

function buildNestedTree(flatArray) {
  const result = [];
  // 遍历所有扁平节点
  flatArray.forEach(item => {
    const dependencyLevels = item.DEPENDENCY.split('.').map(Number);
    // 初始指针指向根数组
    let currentLevel = result;
    // 遍历除最后一层外的所有层级,定位到父节点的CHILDREN数组
    for (let i = 0; i < dependencyLevels.length - 1; i++) {
      const index = dependencyLevels[i];
      // 若节点没有CHILDREN数组则初始化
      if (!currentLevel[index].CHILDREN) currentLevel[index].CHILDREN = [];
      // 指针移动到下一层级的CHILDREN数组
      currentLevel = currentLevel[index].CHILDREN;
    }
    // 最后一层索引对应的位置插入当前节点
    const lastIndex = dependencyLevels.at(-1);
    currentLevel[lastIndex] = item;
  });
  return result;
}

// 调用示例
const myArray = buildNestedTree(initArray);

代码说明

  • 完全适配给出的输入输出格式,无需修改原数据结构即可直接使用
  • 支持任意深度的DEPENDENCY层级,例如0.1.2.3.4.5这类6层结构也可以自动完成嵌套
  • 时间复杂度为O(n * k),其中n是扁平数组长度,k是平均嵌套深度,性能稳定

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 12:45:07