// const chapter = [ // { // level: 1, // id: 1, // name: '第一卷', // }, // { // level: 2, // id: 2, // name: '第一章', // }, // { // level: 3, // id: 12, // name: '第一节', // }, // { // level: 2, // id: 3, // name: '第二章', // }, // { // level: 2, // id: 4, // name: '第三章', // }, // { // level: 1, // id: 5, // name: '第二卷', // }, // { // level: 2, // id: 6, // name: '第一章', // }, // { // level: 2, // id: 7, // name: '第二章', // }, // { // level: 2, // id: 8, // name: '第三章', // }, // { // level: 1, // id: 9, // name: '第三卷', // }, // { // level: 2, // id: 10, // name: '第一章', // }, // { // level: 2, // id: 11, // name: '第二章', // }, // ] // // function buildTree(chapters) { // const tree = []; // let currentVolume = null; // // chapters.forEach(chapter => { // if (chapter.level === 1) { // // Create a new volume node // currentVolume = { // ...chapter, // children: [] // }; // tree.push(currentVolume); // } else if (chapter.level === 2 && currentVolume) { // // Add chapter to the current volume's children // currentVolume.children.push(chapter); // } // }); // // return tree; // } // // const chapterTree = buildTree(chapter); // // console.log(JSON.stringify(chapterTree, null, 2)); // ================================================= function buildTree(data) { const nodeMap = new Map(); const tree = []; // 初始化节点映射 data.forEach(node => { // 确保每个节点都有 children 属性 node.children = []; nodeMap.set(node.id, node); }); // 构建树 data.forEach(node => { if (node.parent_id !== null) { // 确保 id 和 parent_id 类型一致 const parentNode = nodeMap.get(Number(node.parent_id)); if (parentNode) { parentNode.children.push(node); } } else { // 顶层节点 tree.push(node); } }); return tree; } // 示例数据 const data = [ {"id":103282,"name":"封面","level":0,"order_id":"b5c723069afad903d9410a1b87ee430d","parent_id":null,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/b5c723069afad903d9410a1b87ee430d.html"}, {"id":103283,"name":"主目录","level":0,"order_id":"d2ae72f833f4622b4dad008d962dca63","parent_id":null,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/d2ae72f833f4622b4dad008d962dca63.html"}, {"id":103284,"name":"史记","level":0,"order_id":"7c95352994901b619b32372054b2ad9d","parent_id":null,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/7c95352994901b619b32372054b2ad9d.html"}, {"id":103285,"name":"五帝本纪第一","level":1,"order_id":"8f528e29556ad5246cf6c972c381bbed","parent_id":103284,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/8f528e29556ad5246cf6c972c381bbed.html"}, {"id":103286,"name":"夏本纪第二","level":1,"order_id":"601b466b63d71a0bf787528254581282","parent_id":103284,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/601b466b63d71a0bf787528254581282.html"}, {"id":103287,"name":"殷本纪第三","level":1,"order_id":"798fc04674f31ceae6c4f4d5b3b9f6db","parent_id":103284,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/798fc04674f31ceae6c4f4d5b3b9f6db.html"}, {"id":103288,"name":"周本纪第四","level":1,"order_id":"8fa943845104b4891a1bf1191c2e2414","parent_id":103284,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/8fa943845104b4891a1bf1191c2e2414.html"}, {"id":103289,"name":"秦本纪第五","level":1,"order_id":"f0371fc303cd35ffe95c4201f7073a91","parent_id":103284,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/f0371fc303cd35ffe95c4201f7073a91.html"}, {"id":103290,"name":"秦始皇本纪第六","level":1,"order_id":"9af7c7db6c4ce70d6c37b47dffbec21f","parent_id":103284,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/9af7c7db6c4ce70d6c37b47dffbec21f.html"}, {"id":103291,"name":"项羽本纪第七","level":1,"order_id":"297ee4d17393155dc0e989a78136984a","parent_id":103284,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/297ee4d17393155dc0e989a78136984a.html"}, ]; // 构建树并输出 const tree = buildTree(data); console.log(JSON.stringify(tree, null, 2));