1. 数据
let arr = [{
id: 1,
name: '部门1',
pid: 0
},
{
id: 2,
name: '部门2',
pid: 1
},
{
id: 3,
name: '部门3',
pid: 1
},
{
id: 4,
name: '部门4',
pid: 3
},
{
id: 5,
name: '部门5',
pid: 4
},
{
id: 6,
name: '部门6',
pid: 100
},
]
2. 递归方法
/**
* 递归查找,获取children
*/
const getChildren = (data, result, pid) => {
data.forEach(item => {
//如果元素的pid 和要查找的pid一致, 生成children格式数据存入结果数据
if (item.pid === pid) {
const newItem = {
...item,
children: []
};
result.push(newItem);
//查每一个数据的子集
getChildren(data, newItem.children, item.id);
}
})
}
/**
* 转换方法
*/
const arrayToTreeRecursive = (data, pid) => {
const result = [];
getChildren(data, result, pid)
return result;
}
let res = arrayToTreeRecursive(arr, 0)
console.log(res)
3. 遍历方法
function arrayToTree(arr) {
const result = []; // 存放结果集
const itemMap = {}; // 键是id 值是children对象的数据
// 先转成map存储,键是id
for (const item of arr) {
itemMap[item.id] = {
...item,
children: []
}
}
for (const item of arr) {
const id = item.id;
const pid = item.pid;
const treeItem = itemMap[id]; //每一个数据
//如果是第一层数据,直接push 到结果数据
if (pid === 0) {
result.push(treeItem);
}
//如果不是第一层,那么放到对应id的children中
else {
//如果不存在该pid的数据,取children会报错,因此赋值一个children
if (!itemMap[pid]) {
itemMap[pid] = {
children: [],
}
}
console.log(itemMap[pid]);
//将子级数据放到对应的children里面
itemMap[pid].children.push(treeItem)
}
}
return result;
}
console.log(arrayToTree(arr))