let treeList = [
  {
    title: 'Node 1',
    key: '0-0',
    children: [
      {
        title: 'Child Node 1-1',
        key: '0-0-0',
        children: [
          {
            title: 'Grandchild Node 1-1-1',
            key: '0-0-0-0',
          },
          {
            title: 'Grandchild Node 1-1-2',
            key: '0-0-0-1',
          },
        ],
      },
      {
        title: 'Child Node 1-2',
        key: '0-0-1',
      },
    ],
  },
  {
    title: 'Node 2',
    key: '0-1',
    children: [
      {
        title: 'Child Node 2-1',
        key: '0-1-0',
      },
    ],
  },
  {
    title: 'Node 3',
    key: '0-2',
  },
];
let requestData =  [
  
  {
      "id": 101,
      "name": "深圳总公司",
      "parentId": 100
  },
  {
      "id": 103,
      "name": "研发部门",
      "parentId": 101
  },
  {
      "id": 108,
      "name": "市场部门",
      "parentId": 102
  },{
    "id": 100,
    "name": "小星星集团有限公司",
    "parentId": 0
},
  {
      "id": 102,
      "name": "长沙分公司",
      "parentId": 100
  },
  {
      "id": 104,
      "name": "市场部门",
      "parentId": 101
  },
  {
      "id": 109,
      "name": "财务部门",
      "parentId": 102
  },
  {
      "id": 105,
      "name": "测试部门",
      "parentId": 101
  },
  {
      "id": 106,
      "name": "财务部门",
      "parentId": 101
  },
  {
      "id": 107,
      "name": "运维部门",
      "parentId": 101
  }
]

为了将requestData转换为treeList格式的数据,我们需要遍历requestData并构建一个树形结构。这里的关键在于识别每个节点的父节点,并将其作为子节点添加到相应的父节点下。

下面是一个简单的实现方法:

  1. 创建一个映射表:首先基于requestData创建一个映射表,键是id,值是对应的对象。
  2. 构建树形结构:然后遍历映射表中的所有条目,如果某个条目的parentId0(根节点),则直接加入到最终的树数组中;如果不是根节点,则找到其父节点,并将其作为子节点添加到父节点下。
  useEffect(() => {
    const idMap = new Map();

    // 映射所有节点
    requestData.forEach(item => {
      idMap.set(item.id, {
        title: item.name,
        key: item.id.toString(),
        children: []
      });
    });

    // 提取根节点
    const treeLists = [];
    requestData.forEach(item => {
      if (item.parentId === 0) {
        treeLists.push(idMap.get(item.id));
      } else {
        const parent = idMap.get(item.parentId);
        if (parent) {
          parent.children.push(idMap.get(item.id));
        }
      }
    });

    // 初始化数据
    setTreeData(treeLists);

    console.log(treeLists); // 检查输出
  }, []);

parenttreeList的关联方式

  • parent是通过idMap查找得到的,它代表某个节点的父节点。
  • 当一个节点被添加到parent.children数组中时,实际上是将它添加到了它所属的父节点的子节点列表中。
  • 所有的根节点都会直接添加到treeList数组中,而这些根节点的children数组中会包含它们各自的子节点。

总结

通过上述过程,parenttreeList之间的关联是通过构建树形结构实现的:

  • 根节点直接添加到treeList中。
  • 非根节点通过parent.children.push(item);的方式添加到它们各自的父节点的子节点列表中。
  • 最终,treeList数组包含了所有根节点及其子节点组成的完整树形结构。