如何根据点分隔ID字符串将对象数组构建为层级结构
层级ID数组转树形结构实现方案
针对给定的ID带层级关系的对象数组,我们可以通过节点映射表+父节点关联的方式快速构建树形结构,具体实现如下:
完整代码
const sample = [ { id: '1' }, { id: '1.1' }, { id: '1.1.1' }, { id: '1.1.2' }, { id: '1.2' }, { id: '1.2.1' }, { id: '1.2.1.1' }, { id: '2' }, { id: '2.1' } ]; function buildTree(arr) { const nodeMap = {}; const result = []; // 初始化所有节点到映射表,添加children属性 arr.forEach(item => { nodeMap[item.id] = { ...item, children: [] }; }); // 遍历关联父节点与子节点 arr.forEach(item => { const idSegments = item.id.split('.'); if (idSegments.length === 1) { // 根节点直接加入结果集 result.push(nodeMap[item.id]); } else { // 生成父节点ID const parentId = idSegments.slice(0, -1).join('.'); // 将当前节点挂载到父节点的children中 nodeMap[parentId].children.push(nodeMap[item.id]); } }); return result; } // 执行并输出结果 const treeStructure = buildTree(sample); console.log(JSON.stringify(treeStructure, null, 2));
核心逻辑说明
- 节点映射表:用
nodeMap存储每个ID对应的节点引用,实现O(1)时间复杂度的节点查找,避免重复遍历数组,提升整体效率。 - 层级拆分与父ID计算:通过
split('.')将ID拆分为层级片段,非根节点的父ID为去掉最后一个片段后的拼接结果。 - 父子关联:根节点直接加入结果数组,非根节点挂载到对应父节点的
children数组中。
这个方案不受原数组中节点顺序影响,即使子节点出现在父节点之前,也能正确构建树形结构。
内容的提问来源于stack exchange,提问作者D3skDev
相关产品推荐
相关产品推荐

