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

如何将对象数组转换为多层嵌套对象?技术方案问询

将扁平对象数组转换为多层嵌套对象的解决方案

问题描述

我有一组对象数组,每个对象都指定了其父级名称(如有)。如何将其转换为单个嵌套对象?我在处理2层及以上的嵌套时遇到了困难。

期望输出

{ 
  "REPORTING PERIOD": "2022",
  "SIGNATURE DATE": "20211005",
  "HOUSE": {
    "OWNER DATA": {
      "FIRST NAME": "Joe",
      "LAST NAME": "Smith"
    },
    "VALUE HISTORY": {
      "INITAL PRICE": "12345",
      "LAST SALE PRICE": "1231236"
    },
    "ADDRESS": {
      "STREET 1": "5 MAIN TERRACE",
      "CITY": "LONDON"
    }
  },
  "AGENT": {
    "COMPANY DATA": {
      "COMPANY NAME": "The Real Agent, Inc",
      "BUSINESS NUMBER": "0021690080"
    },
    "BUSINESS ADDRESS": {
      "STREET 1": "800 MENLO STREET, SUITE 100",
      "CITY": "MENLO PARK",
      "ZIP": "94025"
    }
  }
}

输入数据

const data = [
    {
        "rank": 0,
        "key": "REPORTING PERIOD",
        "value": "2022",
        "parent": ""
    },
    {
        "rank": 0,
        "key": "SIGNATURE DATE",
        "value": "20211005",
        "parent": ""
    },
   
    {
        "rank": 0,
        "key": "HOUSE",
        "value": "",
        "parent": ""
    },
    {
        "rank": 1,
        "key": "OWNER DATA",
        "value": "",
        "parent": "HOUSE"
    },
    {
        "rank": 2,
        "key": "FIRST NAME",
        "value": "Joe",
        "parent": "OWNER DATA"
    },
    {
        "rank": 2,
        "key": "LAST NAME",
        "value": "Smith",
        "parent": "OWNER DATA"
    },
    {
        "rank": 1,
        "key": "VALUE HISTORY",
        "value": "",
        "parent": "HOUSE"
    },
    {
        "rank": 2,
        "key": "INITAL PRICE",
        "value": "12345",
        "parent": "VALUE HISTORY"
    },
    {
        "rank": 2,
        "key": "LAST SALE PRICE",
        "value": "1231236",
        "parent": "VALUE HISTORY"
    },
    {
        "rank": 1,
        "key": "ADDRESS",
        "value": "",
        "parent": "HOUSE"
    },
    {
        "rank": 2,
        "key": "STREET 1",
        "value": "5 MAIN TERRACE",
        "parent": "ADDRESS"
    },
    {
        "rank": 2,
        "key": "CITY",
        "value": "LONDON",
        "parent": "ADDRESS"
    },   
    {
        "rank": 0,
        "key": "AGENT",
        "value": "",
        "parent": ""
    },
    {
        "rank": 1,
        "key": "COMPANY DATA",
        "value": "",
        "parent": "AGENT"
    },
    {
        "rank": 2,
        "key": "COMPANY NAME",
        "value": "The Real Agent, Inc",
        "parent": "COMPANY DATA"
    },
    {
        "rank": 2,
        "key": "BUSINESS NUMBER",
        "value": "0021690080",
        "parent": "COMPANY DATA"
    },
    
    {
        "rank": 1,
        "key": "BUSINESS ADDRESS",
        "value": "",
        "parent": "AGENT"
    },
    {
        "rank": 2,
        "key": "STREET 1",
        "value": "800 MENLO STREET, SUITE 100",
        "parent": "BUSINESS ADDRESS"
    },
    {
        "rank": 2,
        "key": "CITY",
        "value": "MENLO PARK",
        "parent": "BUSINESS ADDRESS"
    },
    {
        "rank": 2,
        "key": "ZIP",
        "value": "94025",
        "parent": "BUSINESS ADDRESS"
    }  
]

现有代码(存在嵌套问题)

const resultObject: Record<string, unknown> = {};

//loop through array
for (const obj of data) {
    const { key, value, parent } = obj;

    if (parent === " " || parent === "" || parent === undefined) {
      resultObject[key] = value; // 无父级时直接作为根属性
    } else {
      // 有父级时挂载到父级下
      if (!resultObject[parent]) {
        resultObject[parent] = {}; // 父级不存在则创建空对象
      }
      (resultObject[parent] as Record<string, unknown>)[key] = value;
    }
  }
  console.log(resultObject);

解决方案

现有代码的问题是仅能处理一层嵌套,无法定位深层父级的实际位置。我们可以通过节点映射表记录每个节点的引用,再按父级关系组装嵌套结构,支持任意层级嵌套。

实现代码

const nodeMap: Record<string, any> = {};
const result: Record<string, any> = {};

// 第一步:初始化所有节点,建立映射关系
for (const item of data) {
    const { key, value, parent } = item;
    // 非空值直接赋值,空值作为容器节点创建空对象
    const node = value ? value : {};
    nodeMap[key] = node;
    
    // 根节点直接加入结果对象
    if (!parent) {
        result[key] = node;
    }
}

// 第二步:根据父级关系挂载子节点
for (const item of data) {
    const { key, parent } = item;
    // 父级存在时,将子节点挂载到父节点对象中
    if (parent && nodeMap[parent]) {
        nodeMap[parent][key] = nodeMap[key];
    }
}

console.log(result);

代码说明

  1. 节点映射表:nodeMap存储每个key对应的对象或值,能快速找到任意节点的引用,避免深层查找的麻烦。
  2. 分两步处理:
    • 先初始化所有节点,根节点直接放入结果,容器节点初始化为空对象。
    • 再遍历节点,利用对象引用直接将子节点挂载到对应父节点上,自然形成多层嵌套。
  3. 扩展性:不管嵌套层级多少,只要父级节点存在,就能正确完成挂载,完全适配需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 02:45:37