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
并构建一个树形结构。这里的关键在于识别每个节点的父节点,并将其作为子节点添加到相应的父节点下。
下面是一个简单的实现方法:
- 创建一个映射表:首先基于
requestData
创建一个映射表,键是id
,值是对应的对象。 - 构建树形结构:然后遍历映射表中的所有条目,如果某个条目的
parentId
为0
(根节点),则直接加入到最终的树数组中;如果不是根节点,则找到其父节点,并将其作为子节点添加到父节点下。
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); // 检查输出
}, []);
parent
与treeList
的关联方式
parent
是通过idMap
查找得到的,它代表某个节点的父节点。- 当一个节点被添加到
parent.children
数组中时,实际上是将它添加到了它所属的父节点的子节点列表中。 - 所有的根节点都会直接添加到
treeList
数组中,而这些根节点的children
数组中会包含它们各自的子节点。
总结
通过上述过程,parent
与treeList
之间的关联是通过构建树形结构实现的:
- 根节点直接添加到
treeList
中。 - 非根节点通过
parent.children.push(item);
的方式添加到它们各自的父节点的子节点列表中。 - 最终,
treeList
数组包含了所有根节点及其子节点组成的完整树形结构。