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

如何基于parent-id将扁平对象数组转换为层级嵌套对象

扁平数组转嵌套树形结构解决方案

需求说明

将包含parentId的扁平对象数组,转换为适合前端树形展示的嵌套JSON结构。

原始数据

{"items":[{"name":"India","id":1563389084200625},{"parentId":1563389084200625,"name":"Karnataka","id":2492715807428324},{"name":"Bangalore","parentId":2492715807428324,"id":3889975945703906}]}

目标结构

{"items":{"name":"India","id":1563389084200625,"children":[{"name":"Karnataka","id":2492715807428324,"children":[{"name":"Bangalore","id":3889975945703906}]}]}}

实现代码(JavaScript)

function buildTree(flatItems) {
  const itemMap = {};
  const rootItems = [];

  // 构建ID到元素的映射,同时为每个元素初始化children数组
  flatItems.forEach(item => {
    itemMap[item.id] = { ...item, children: [] };
  });

  // 遍历元素,将子元素挂载到对应父元素的children中
  flatItems.forEach(item => {
    if (item.parentId) {
      const parentItem = itemMap[item.parentId];
      parentItem?.children.push(itemMap[item.id]);
    } else {
      // 无parentId的元素作为根节点
      rootItems.push(itemMap[item.id]);
    }
  });

  // 示例中仅存在一个根节点,直接返回;若有多个根节点可返回rootItems数组
  return { items: rootItems[0] };
}

// 测试转换
const rawData = {"items":[{"name":"India","id":1563389084200625},{"parentId":1563389084200625,"name":"Karnataka","id":2492715807428324},{"name":"Bangalore","parentId":2492715807428324,"id":3889975945703906}]};
const treeResult = buildTree(rawData.items);
console.log(JSON.stringify(treeResult, null, 2));

代码逻辑说明

  1. 构建映射表:通过遍历扁平数组,将每个元素的id作为键,存储带空children数组的元素副本,方便后续快速查找父元素。
  2. 挂载子元素:再次遍历数组,若元素存在parentId,则找到对应父元素并将自身添加到父元素的children数组中;无parentId的元素直接作为根节点。
  3. 返回结果:根据示例需求,返回包含单个根节点的结构;若存在多个根节点,可直接返回rootItems数组。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 15:15:27