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

如何根据点分隔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));

核心逻辑说明

  1. 节点映射表:用nodeMap存储每个ID对应的节点引用,实现O(1)时间复杂度的节点查找,避免重复遍历数组,提升整体效率。
  2. 层级拆分与父ID计算:通过split('.')将ID拆分为层级片段,非根节点的父ID为去掉最后一个片段后的拼接结果。
  3. 父子关联:根节点直接加入结果数组,非根节点挂载到对应父节点的children数组中。

这个方案不受原数组中节点顺序影响,即使子节点出现在父节点之前,也能正确构建树形结构。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 13:50:39