1. /**
    2. * @description 将扁平化数据 转换成 树状结构
    3. * @param {Array} arrayList 扁平化的数据
    4. * @param {String} pidStr parentId的key名
    5. * @param {String} idStr id的key名
    6. * @param {String} childrenStr children的key名
    7. */
    8. function fommat({arrayList, pidStr = 'pid', idStr = 'id', childrenStr = 'children'}) {
    9. let listOjb = {}; // 用来储存{key: obj}格式的对象
    10. let treeList = []; // 用来储存最终树形结构数据的数组
    11. // 将数据变换成{key: obj}格式,方便下面处理数据
    12. for (let i = 0; i < arrayList.length; i++) {
    13. listOjb[arrayList[i][idStr]] = arrayList[i]
    14. }
    15. // 根据pid来将数据进行格式化
    16. for (let j = 0; j < arrayList.length; j++) {
    17. // 判断父级是否存在
    18. let haveParent = listOjb[arrayList[j][pidStr]]
    19. if (haveParent) {
    20. // 如果有没有父级children字段,就创建一个children字段
    21. !haveParent[childrenStr] && (haveParent[childrenStr] = [])
    22. // 在父级里插入子项
    23. haveParent[childrenStr].push(arrayList[j])
    24. } else {
    25. // 如果没有父级直接插入到最外层
    26. treeList.push(arrayList[j])
    27. }
    28. }
    29. return treeList
    30. }
    31. // 测试数据
    32. var menu_list = [{
    33. id: '1',
    34. menu_name: '设置',
    35. menu_url: 'setting',
    36. parent_id: 0
    37. }, {
    38. id: '1-1',
    39. menu_name: '权限设置',
    40. menu_url: 'setting.permission',
    41. parent_id: '1'
    42. }, {
    43. id: '1-1-1',
    44. menu_name: '用户管理列表',
    45. menu_url: 'setting.permission.user_list',
    46. parent_id: '1-1'
    47. }, {
    48. id: '1-1-2',
    49. menu_name: '用户管理新增',
    50. menu_url: 'setting.permission.user_add',
    51. parent_id: '1-1'
    52. }, {
    53. id: '1-1-3',
    54. menu_name: '角色管理列表',
    55. menu_url: 'setting.permission.role_list',
    56. parent_id: '1-1'
    57. }, {
    58. id: '1-2',
    59. menu_name: '菜单设置',
    60. menu_url: 'setting.menu',
    61. parent_id: '1'
    62. }, {
    63. id: '1-2-1',
    64. menu_name: '菜单列表',
    65. menu_url: 'setting.menu.menu_list',
    66. parent_id: '1-2'
    67. }, {
    68. id: '1-2-2',
    69. menu_name: '菜单添加',
    70. menu_url: 'setting.menu.menu_add',
    71. parent_id: '1-2'
    72. }, {
    73. id: '2',
    74. menu_name: '订单',
    75. menu_url: 'order',
    76. parent_id: 0
    77. }, {
    78. id: '2-1',
    79. menu_name: '报单审核',
    80. menu_url: 'order.orderreview',
    81. parent_id: '2'
    82. }, {
    83. id: '2-2',
    84. menu_name: '退款管理',
    85. menu_url: 'order.refundmanagement',
    86. parent_id: '2'
    87. }, {
    88. id: '2-2-1',
    89. menu_name: '退款管理2-1',
    90. menu_url: 'order.refundmanagement',
    91. parent_id: '2-2'
    92. }
    93. ]
    94. // 输出
    95. console.log(
    96. fommat({
    97. arrayList: menu_list,
    98. pidStr: 'parent_id'
    99. })
    100. )
    1. const arr = [
    2. {id: 2, name: '部门2', pid: 1},
    3. {id: 3, name: '部门3', pid: 1},
    4. {id: 4, name: '部门4', pid: 3},
    5. {id: 5, name: '部门5', pid: 4},
    6. {id: 6, name: '部门', pid: 0},
    7. {id: 1, name: '部门1', pid: 0}
    8. ]
    9. function arrayToTree(items) {
    10. const result = []; // 存放结果集
    11. const itemMap = {}; //
    12. // 先转成map存储
    13. for (const item of items) {
    14. itemMap[item.id] = {...item, children: []}
    15. }
    16. items.forEach(item => {
    17. const id = item.id;
    18. const pid = item.pid;
    19. const treeItem = itemMap[id];
    20. if (pid === 0) {
    21. result.push(treeItem);
    22. } else {
    23. if (!itemMap[pid]) {
    24. itemMap[pid] = {
    25. children: [],
    26. }
    27. }
    28. itemMap[pid].children.push(treeItem)
    29. }
    30. })
    31. return result;
    32. }
    33. console.log(arrayToTree(arr))
    34. // const arr = [
    35. {id: 2, name: '部门2', pid: 1},
    36. {id: 3, name: '部门3', pid: 1},
    37. {id: 4, name: '部门4', pid: 3},
    38. {id: 5, name: '部门5', pid: 4},
    39. {id: 6, name: '部门', pid: 0},
    40. {id: 1, name: '部门1', pid: 0}
    41. ]
    42. function arrayToTree(items) {
    43. const result = []; // 存放结果集
    44. const itemMap = {}; //
    45. // 先转成map存储
    46. for (const item of items) {
    47. itemMap[item.id] = {...item, children: []}
    48. }
    49. items.forEach(item => {
    50. const id = item.id;
    51. const pid = item.pid;
    52. const treeItem = itemMap[id];
    53. if (pid === 0) {
    54. result.push(treeItem);
    55. } else {
    56. if (!itemMap[pid]) {
    57. itemMap[pid] = {
    58. children: [],
    59. }
    60. }
    61. itemMap[pid].children.push(treeItem)
    62. }
    63. })
    64. return result;
    65. }
    66. console.log(arrayToTree(arr))