js 组装树形结构

发布于:2025-06-26 ⋅ 阅读:(20) ⋅ 点赞:(0)

初始数据结构

let data = [
    {
        "id": 1,
        "parentId": 32,
        "name": "测试1",
        "nodelevel": 0,
    },
    {
        "id": 2,
        "parentId": 32,
        "name": "测试2",
        "nodelevel": 3,
    },
    {
        "id": 3,
        "parentId": 2,
        "name": "测试2-0",
        "nodelevel": 4,
    },
    {
        "id": 4,
        "parentId": 2,
        "name": "测试2-1",
        "nodelevel": 4,
    },
    {
        "id": 6,
        "parentId": 3,
        "name": "测试2-0-0",
        "nodelevel": 5,
    },
    {
        "id": 7,
        "parentId": 3,
        "name": "测试2-0-1",
        "nodelevel": 5,
    },
    {
        "id": 8,
        "parentId": 3,
        "name": "测试2-0-2",
        "nodelevel": 5,
    },
    {
        "id": 9,
        "parentId": 3,
        "name": "测试2-0-3",
        "nodelevel": 5,
    },
    {
        "id": 10,
        "parentId": 3,
        "name": "测试2-0-4",
        "nodelevel": 5,
    },
    {
        "id": 11,
        "parentId": 4,
        "name": "测试2-1-0",
        "nodelevel": 5,
    },
    {
        "id": 12,
        "parentId": 4,
        "name": "测试2-1-1",
        "nodelevel": 5,
    },
    {
        "id": 13,
        "parentId": 4,
        "name": "测试2-1-2",
        "nodelevel": 5,
    },
    {
        "id": 14,
        "parentId": 2,
        "name": "测试2-2",
        "nodelevel": 0,
    },
    {
        "id": 15,
        "parentId": 2,
        "name": "测试2-3",
        "nodelevel": 0,
    },
    {
        "id": 16,
        "parentId": 2,
        "name": "测试2-4",
        "nodelevel": 0,
    },
    {
        "id": 17,
        "parentId": 14,
        "name": "测试2-2-0",
        "nodelevel": 0,
    },
    {
        "id": 18,
        "parentId": 15,
        "name": "测试2-3-0",
        "nodelevel": 0,
    },
    {
        "id": 19,
        "parentId": 16,
        "name": "测试2-4-0",
        "nodelevel": 0,
    },
    {
        "id": 20,
        "parentId": 16,
        "name": "测试2-4-1",
        "nodelevel": 0,
    },
    {
        "id": 21,
        "parentId": 2,
        "name": "测试2-5",
        "nodelevel": 0,
    },
    {
        "id": 22,
        "parentId": 21,
        "name": "测试2-5-0",
        "nodelevel": 0,
    },
    {
        "id": 23,
        "parentId": 21,
        "name": "测试2-5-1",
        "nodelevel": 0,
    },
    {
        "id": 25,
        "parentId": 2,
        "name": "测试2-6",
        "nodelevel": 0,
    },
    {
        "id": 26,
        "parentId": 4,
        "name": "测试2-1-3",
        "nodelevel": 5,
    },
    {
        "id": 27,
        "parentId": 25,
        "name": "技术部1组",
        "nodelevel": 0,
    },
    {
        "id": 28,
        "parentId": 25,
        "name": "技术部2组",
        "sortid": 2,
        "nodelevel": 0,
    },
    {
        "id": 29,
        "parentId": 21,
        "name": "投研三部",
        "nodelevel": 0,
    },
    {
        "id": 30,
        "parentId": 32,
        "name": "策划部",
        "nodelevel": 0,
    },
    {
        "id": 32,
        "parentId": 31,
        "name": "部门",
        "nodelevel": 2,
    },
    {
        "id": 54,
        "parentId": 2,
        "name": "A软件部",
        "nodelevel": 0,
    },
    {
        "id": 57,
        "parentId": 54,
        "name": "一部1组",
        "nodelevel": 0,
    },
    {
        "id": 58,
        "parentId": 32,
        "name": "测试3",
        "nodelevel": 0,
    },
    {
        "id": 59,
        "parentId": 2,
        "name": "测试2-7",
        "nodelevel": 0,
    },
    {
        "id": 67,
        "parentId": 0,
        "name": "测试部门",
        "nodelevel": 0,
    },
    {
        "id": 69,
        "parentId": 59,
        "name": "客1部",
        "nodelevel": 0,
    },
    {
        "id": 70,
        "parentId": 59,
        "name": "客2部",
        "sortid": 2,
        "nodelevel": 0,
    },
    {
        "id": 71,
        "parentId": 59,
        "name": "客3部",
        "nodelevel": 0,
    },
    {
        "id": 72,
        "parentId": 59,
        "name": "客4部",
        "nodelevel": 0,
    },
    {
        "id": 73,
        "parentId": 21,
        "name": "研四部",
        "nodelevel": 0,
    },
    {
        "id": 74,
        "parentId": 32,
        "name": "测试4",
        "nodelevel": 0,
    }
]

实现代码:
这里用的是递归

created(){
const treeData=this.setArrayTree(data,0)
//这里没有根节点数据也存在父节点找不到的情况,所有做过滤  
let data1 = treeData.filter(
            (item) =>
              treeData.findIndex(
                (o) => o.companyDepartmentId == item.parentid
              ) == -1
          );

},
  methods: {
// 组装树形结构(这里使用了递归)
    setArrayTree(data, parentId = '') {
      const rootItems = data;
      const childrenOfItem = new Map();
      for (const item of data) {
        const parentId = item.parentid;
        if (!childrenOfItem.has(parentId)) {
          //map中不存在该数据
          childrenOfItem.set(parentId, []); //存至map中并赋值为空
        }
        childrenOfItem.get(parentId).push(item); //parentId相同的存在一起
      }
      // 递归构建子树
      function addChildren(nodes) {
        return nodes.map((node) => {
          return childrenOfItem.get(node.companyDepartmentId)
            ? {
                ...node,
                children: addChildren(
                  childrenOfItem.get(node.companyDepartmentId) || []
                ),
              }
            : node;
        });
      }
      if (typeof parentId === 'number')
        return addChildren(childrenOfItem.get(parentId) || []);
      return addChildren(rootItems);
    },
 }

非递归实现方法:

created(){
const treeData=this.buildTree(data)
},
  methods: {
  //数据组装
 buildTree(data, parentId = '') {
      // 检查数据是否为空
      if (!data || data.length === 0) return [];

      // 创建一个 Map,用于快速查找节点
      const nodeMap = new Map();
      data.forEach((item) => {
        nodeMap.set(item.companyDepartmentId, item); // 将每个节点存储到 Map 中
      });

      // 构建树形结构
      const tree = [];
      data.forEach((item) => {
        // 如果当前节点的 parentId 存在,且 parentId 对应的节点在 Map 中
        if (nodeMap.has(item.parentid)) {
          const parent = nodeMap.get(item.parentid);
          if (!parent.children) {
            parent.children = []; // 初始化父节点的 children 属性
          }
          parent.children.push(item); // 将当前节点添加到父节点的 children 中
        } else {
          // 如果当前节点的 parentId 不存在(即根节点),则直接添加到树中
          tree.push(item);
        }
      });

      return tree;
    },

获取结果:

[
    {
        "id": 32,
        "parentId": 31,
        "name": "部门",
        "nodelevel": 2,
        "children": [
            {
                "id": 1,
                "parentId": 32,
                "name": "测试1",
                "nodelevel": 0
            },
            {
                "id": 2,
                "parentId": 32,
                "name": "测试2",
                "nodelevel": 3,
                "children": [
                    {
                        "id": 3,
                        "parentId": 2,
                        "name": "测试2-0",
                        "nodelevel": 4,
                        "children": [
                            {
                                "id": 6,
                                "parentId": 3,
                                "name": "测试2-0-0",
                                "nodelevel": 5
                            },
                            {
                                "id": 7,
                                "parentId": 3,
                                "name": "测试2-0-1",
                                "nodelevel": 5
                            },
                            {
                                "id": 8,
                                "parentId": 3,
                                "name": "测试2-0-2",
                                "nodelevel": 5
                            },
                            {
                                "id": 9,
                                "parentId": 3,
                                "name": "测试2-0-3",
                                "nodelevel": 5
                            },
                            {
                                "id": 10,
                                "parentId": 3,
                                "name": "测试2-0-4",
                                "nodelevel": 5
                            }
                        ]
                    },
                    {
                        "id": 4,
                        "parentId": 2,
                        "name": "测试2-1",
                        "nodelevel": 4,
                        "children": [
                            {
                                "id": 11,
                                "parentId": 4,
                                "name": "测试2-1-0",
                                "nodelevel": 5
                            },
                            {
                                "id": 12,
                                "parentId": 4,
                                "name": "测试2-1-1",
                                "nodelevel": 5
                            },
                            {
                                "id": 13,
                                "parentId": 4,
                                "name": "测试2-1-2",
                                "nodelevel": 5
                            },
                            {
                                "id": 26,
                                "parentId": 4,
                                "name": "测试2-1-3",
                                "nodelevel": 5
                            }
                        ]
                    },
                    {
                        "id": 14,
                        "parentId": 2,
                        "name": "测试2-2",
                        "nodelevel": 0,
                        "children": [
                            {
                                "id": 17,
                                "parentId": 14,
                                "name": "测试2-2-0",
                                "nodelevel": 0
                            }
                        ]
                    },
                    {
                        "id": 15,
                        "parentId": 2,
                        "name": "测试2-3",
                        "nodelevel": 0,
                        "children": [
                            {
                                "id": 18,
                                "parentId": 15,
                                "name": "测试2-3-0",
                                "nodelevel": 0
                            }
                        ]
                    },
                    {
                        "id": 16,
                        "parentId": 2,
                        "name": "测试2-4",
                        "nodelevel": 0,
                        "children": [
                            {
                                "id": 19,
                                "parentId": 16,
                                "name": "测试2-4-0",
                                "nodelevel": 0
                            },
                            {
                                "id": 20,
                                "parentId": 16,
                                "name": "测试2-4-1",
                                "nodelevel": 0
                            }
                        ]
                    },
                    {
                        "id": 21,
                        "parentId": 2,
                        "name": "测试2-5",
                        "nodelevel": 0,
                        "children": [
                            {
                                "id": 22,
                                "parentId": 21,
                                "name": "测试2-5-0",
                                "nodelevel": 0
                            },
                            {
                                "id": 23,
                                "parentId": 21,
                                "name": "测试2-5-1",
                                "nodelevel": 0
                            },
                            {
                                "id": 29,
                                "parentId": 21,
                                "name": "投研三部",
                                "nodelevel": 0
                            },
                            {
                                "id": 73,
                                "parentId": 21,
                                "name": "研四部",
                                "nodelevel": 0
                            }
                        ]
                    },
                    {
                        "id": 25,
                        "parentId": 2,
                        "name": "测试2-6",
                        "nodelevel": 0,
                        "children": [
                            {
                                "id": 27,
                                "parentId": 25,
                                "name": "技术部1组",
                                "nodelevel": 0
                            },
                            {
                                "id": 28,
                                "parentId": 25,
                                "name": "技术部2组",
                                "sortid": 2,
                                "nodelevel": 0
                            }
                        ]
                    },
                    {
                        "id": 54,
                        "parentId": 2,
                        "name": "A软件部",
                        "nodelevel": 0,
                        "children": [
                            {
                                "id": 57,
                                "parentId": 54,
                                "name": "一部1组",
                                "nodelevel": 0
                            }
                        ]
                    },
                    {
                        "id": 59,
                        "parentId": 2,
                        "name": "测试2-7",
                        "nodelevel": 0,
                        "children": [
                            {
                                "id": 69,
                                "parentId": 59,
                                "name": "客1部",
                                "nodelevel": 0
                            },
                            {
                                "id": 70,
                                "parentId": 59,
                                "name": "客2部",
                                "sortid": 2,
                                "nodelevel": 0
                            },
                            {
                                "id": 71,
                                "parentId": 59,
                                "name": "客3部",
                                "nodelevel": 0
                            },
                            {
                                "id": 72,
                                "parentId": 59,
                                "name": "客4部",
                                "nodelevel": 0
                            }
                        ]
                    }
                ]
            },
            {
                "id": 30,
                "parentId": 32,
                "name": "策划部",
                "nodelevel": 0
            },
            {
                "id": 58,
                "parentId": 32,
                "name": "测试3",
                "nodelevel": 0
            },
            {
                "id": 74,
                "parentId": 32,
                "name": "测试4",
                "nodelevel": 0
            }
        ]
    },
    {
        "id": 67,
        "parentId": 0,
        "name": "测试部门",
        "nodelevel": 0
    }
]

网站公告

今日签到

点亮在社区的每一天
去签到