如何从含多级分类的扁平对象数组构建树形结构?
从扁平数组构建多级分类树形结构解决方案
输入示例
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
相关产品推荐
相关产品推荐

