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

如何从含多级分类的扁平对象数组构建树形结构?

从扁平数组构建多级分类树形结构解决方案

输入示例

let data = [
  {
    category: ["Kat1"],
    otherFields: ["Document 1"]
  },
  {
    category: ["Kat1"],
    otherFields: ["Document 2"]
  },
  {
    category: ["Test", "Test 2"],
    otherFields: ["Document 1"]
  },
  {
    category: ["Test", "Test 2", "Test 3", "Test 4", "Test 5", "Test 6", "Test 7", "Test 8", "Test 9", "Test 10", "Test 11"],
    otherFields: ["Document 1"]
  }
]

期望输出

let tree = [
  {
    label: "Kat1",
    children: [
      { label: "Document 1" },
      { label: "Document 2" }
    ]
  },
  {
    label: "Test",
    children: [
      { 
        label: "Test 2",
        children: [
          { label: "Document 1" },
          { 
            label: 'Test 3',
            children: [
              { 
                label: 'Test 4', 
                children: [
                  { label: 'Test 5', children: [
                    { label: 'Test 6', children: [
                      { label: 'Test 7', children: [
                        { label: 'Test 8', children: [
                          { label: 'Test 9', children: [
                            { label: 'Test 10', children: [
                              { label: 'Test 11' }
                            ]}
                          ]}
                        ]}
                      ]}
                    ]}
                  ]}
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]

解决方案代码

function buildTree(data) {
  const tree = [];
  const nodeMap = new Map();

  data.forEach(item => {
    const categories = item.category;
    const docs = item.otherFields;
    
    let currentLevel = tree;
    let parentKey = '';

    // 遍历分类路径,构建各级分类节点
    categories.forEach((cat, index) => {
      const key = parentKey ? `${parentKey}-${cat}` : cat;
      // 检查当前节点是否已存在
      let node = nodeMap.get(key);
      if (!node) {
        node = { label: cat, children: [] };
        nodeMap.set(key, node);
        currentLevel.push(node);
      }
      // 进入下一级节点集合
      currentLevel = node.children;
      parentKey = key;
    });

    // 将文档添加到当前分类的子节点中
    docs.forEach(doc => {
      currentLevel.push({ label: doc });
    });
  });

  return tree;
}

// 调用示例
const result = buildTree(data);
console.log(JSON.stringify(result, null, 2));

代码说明

  • 使用nodeMap存储已创建的分类节点,通过拼接分类路径作为唯一键,避免重复创建相同层级的分类节点
  • 遍历每个数据项的分类路径,逐级检查节点存在性,不存在则创建并插入到当前层级的children数组
  • 完成分类路径遍历后,将当前数据项的文档逐个添加到最后一级分类的children数组中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 10:33:27