js写法。
基础数据
const list = [
{
id: 1001,
parentId: 0,
name: "AA",
},
{
id: 1002,
parentId: 1001,
name: "BB",
},
{
id: 1003,
parentId: 1001,
name: "CC",
},
{
id: 1004,
parentId: 1003,
name: "DD",
},
{
id: 1005,
parentId: 1003,
name: "EE",
},
{
id: 1006,
parentId: 1002,
name: "FF",
},
{
id: 1007,
parentId: 1002,
name: "GG",
},
{
id: 1008,
parentId: 1004,
name: "HH",
},
{
id: 1009,
parentId: 1005,
name: "II",
},
];
方法一:递归算法
//获取这个id下面的子树的数据
const getTree =(key)=>{
let arr = [];//用于保存这个id下的子们
list.map(item=>{
if(item.parentId === key){//当前节点的父是这个key
arr.push(item);//这个节点保存到arr中,用与后面返回
item.children = getTree(item.id);//当前节点的children,就继续调用getTree方法组建这个id下的tree。启动迭代
}
})
return arr;//如果没有的话,就返回空数组
}
方法二:非递归
//非递归算法。处理离散数组,成整个树。不断找当前节点的父节点
const getTree2 =()=>{
const res = [];//由最头上的内容开始,整个数的内容
list2.forEach((item) => {
const parent = list2.find((node) => node.id === item.parentId);//获取当前节点的父
if (parent) {//如果父存在的话
//操作这个父
parent.children = parent.children || [];//先拼接父亲之前的子内容
parent.children.push(item);//然后将父的子增加上当前这个节点
} else {//如果当前节点不存在父,则他自己就是父
//当没有父节点的时候,放在最顶端
res.push(item);
}
});
return res;
}
方法三:非递归,优化算法运行时间复杂度
//非递归算法(利用hashMap优化找父节点的时间)。处理离散数组,成整个树。不断找当前节点的父节点
const getTree3 =()=>{
const res = [];//由最头上的内容开始,整个数的内容
let obj={};
list3.map((item)=>{
obj[item.id] = item;
})
console.log('重新组装的obj对象===',obj);
list3.forEach((item) => {
const parent = obj[item.parentId];//获取当前节点的父
if (parent) {//如果父存在的话
//操作这个父
parent.children = parent.children || [];//先拼接父亲之前的子内容、针对obj对象进行编辑
parent.children.push(item);//然后将父的子增加上当前这个节点
} else {//如果当前节点不存在父,则他自己就是父
//当没有父节点的时候,放在最顶端
res.push(item);
}
});
return res;
}