tree.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. // const chapter = [
  2. // {
  3. // level: 1,
  4. // id: 1,
  5. // name: '第一卷',
  6. // },
  7. // {
  8. // level: 2,
  9. // id: 2,
  10. // name: '第一章',
  11. // },
  12. // {
  13. // level: 3,
  14. // id: 12,
  15. // name: '第一节',
  16. // },
  17. // {
  18. // level: 2,
  19. // id: 3,
  20. // name: '第二章',
  21. // },
  22. // {
  23. // level: 2,
  24. // id: 4,
  25. // name: '第三章',
  26. // },
  27. // {
  28. // level: 1,
  29. // id: 5,
  30. // name: '第二卷',
  31. // },
  32. // {
  33. // level: 2,
  34. // id: 6,
  35. // name: '第一章',
  36. // },
  37. // {
  38. // level: 2,
  39. // id: 7,
  40. // name: '第二章',
  41. // },
  42. // {
  43. // level: 2,
  44. // id: 8,
  45. // name: '第三章',
  46. // },
  47. // {
  48. // level: 1,
  49. // id: 9,
  50. // name: '第三卷',
  51. // },
  52. // {
  53. // level: 2,
  54. // id: 10,
  55. // name: '第一章',
  56. // },
  57. // {
  58. // level: 2,
  59. // id: 11,
  60. // name: '第二章',
  61. // },
  62. // ]
  63. //
  64. // function buildTree(chapters) {
  65. // const tree = [];
  66. // let currentVolume = null;
  67. //
  68. // chapters.forEach(chapter => {
  69. // if (chapter.level === 1) {
  70. // // Create a new volume node
  71. // currentVolume = {
  72. // ...chapter,
  73. // children: []
  74. // };
  75. // tree.push(currentVolume);
  76. // } else if (chapter.level === 2 && currentVolume) {
  77. // // Add chapter to the current volume's children
  78. // currentVolume.children.push(chapter);
  79. // }
  80. // });
  81. //
  82. // return tree;
  83. // }
  84. //
  85. // const chapterTree = buildTree(chapter);
  86. //
  87. // console.log(JSON.stringify(chapterTree, null, 2));
  88. // =================================================
  89. function buildTree(data) {
  90. const nodeMap = new Map();
  91. const tree = [];
  92. // 初始化节点映射
  93. data.forEach(node => {
  94. // 确保每个节点都有 children 属性
  95. node.children = [];
  96. nodeMap.set(node.id, node);
  97. });
  98. // 构建树
  99. data.forEach(node => {
  100. if (node.parent_id !== null) {
  101. // 确保 id 和 parent_id 类型一致
  102. const parentNode = nodeMap.get(Number(node.parent_id));
  103. if (parentNode) {
  104. parentNode.children.push(node);
  105. }
  106. } else {
  107. // 顶层节点
  108. tree.push(node);
  109. }
  110. });
  111. return tree;
  112. }
  113. // 示例数据
  114. const data = [
  115. {"id":103282,"name":"封面","level":0,"order_id":"b5c723069afad903d9410a1b87ee430d","parent_id":null,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/b5c723069afad903d9410a1b87ee430d.html"},
  116. {"id":103283,"name":"主目录","level":0,"order_id":"d2ae72f833f4622b4dad008d962dca63","parent_id":null,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/d2ae72f833f4622b4dad008d962dca63.html"},
  117. {"id":103284,"name":"史记","level":0,"order_id":"7c95352994901b619b32372054b2ad9d","parent_id":null,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/7c95352994901b619b32372054b2ad9d.html"},
  118. {"id":103285,"name":"五帝本纪第一","level":1,"order_id":"8f528e29556ad5246cf6c972c381bbed","parent_id":103284,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/8f528e29556ad5246cf6c972c381bbed.html"},
  119. {"id":103286,"name":"夏本纪第二","level":1,"order_id":"601b466b63d71a0bf787528254581282","parent_id":103284,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/601b466b63d71a0bf787528254581282.html"},
  120. {"id":103287,"name":"殷本纪第三","level":1,"order_id":"798fc04674f31ceae6c4f4d5b3b9f6db","parent_id":103284,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/798fc04674f31ceae6c4f4d5b3b9f6db.html"},
  121. {"id":103288,"name":"周本纪第四","level":1,"order_id":"8fa943845104b4891a1bf1191c2e2414","parent_id":103284,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/8fa943845104b4891a1bf1191c2e2414.html"},
  122. {"id":103289,"name":"秦本纪第五","level":1,"order_id":"f0371fc303cd35ffe95c4201f7073a91","parent_id":103284,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/f0371fc303cd35ffe95c4201f7073a91.html"},
  123. {"id":103290,"name":"秦始皇本纪第六","level":1,"order_id":"9af7c7db6c4ce70d6c37b47dffbec21f","parent_id":103284,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/9af7c7db6c4ce70d6c37b47dffbec21f.html"},
  124. {"id":103291,"name":"项羽本纪第七","level":1,"order_id":"297ee4d17393155dc0e989a78136984a","parent_id":103284,"path":"./base_files/1a7c3ccc61a0c00998d588971ee4e567/Text/297ee4d17393155dc0e989a78136984a.html"},
  125. ];
  126. // 构建树并输出
  127. const tree = buildTree(data);
  128. console.log(JSON.stringify(tree, null, 2));