如何基于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));
代码逻辑说明
- 构建映射表:通过遍历扁平数组,将每个元素的
id作为键,存储带空children数组的元素副本,方便后续快速查找父元素。 - 挂载子元素:再次遍历数组,若元素存在
parentId,则找到对应父元素并将自身添加到父元素的children数组中;无parentId的元素直接作为根节点。 - 返回结果:根据示例需求,返回包含单个根节点的结构;若存在多个根节点,可直接返回
rootItems数组。
内容的提问来源于stack exchange,提问作者Kallol Medhi
相关产品推荐
相关产品推荐

