迭代算法:
如下, 给出一个数据结构:oldData,使它变成一个 节点层级结构, 满足条件:所有子节点的属性pid是其父节点的id, 于是可以这样设计:
let oldData = [
{id: 1, pid: 0, labelName: "test222"},
{id: 3, pid: 1, labelName: "小明7"},
{id: 5, pid: 1, labelName: "小明4"},
{id: 6, pid: 3, labelName: "小明3"},
{id: 7, pid: 1, labelName: "小明22"},
{id: 60, pid: 0, labelName: "DFss"},
{id: 12, pid: 0, labelName: "hhhlo"}
]
//首次遍历出pid为0,也就是根节点的所有节点,这是第一列父节点;
let initialData = oldData.filter((item)=>{
if(item.pid === 0){
return item;
}
})
//开始迭代,迭代函数recur接受一个子节点列表做为参数;
function recur(childrens){
//创建一个临时空数组,表示符合条件的子节点集合
let _childrens = [];
//遍历迭代参数中childrens的个数
for(let i=0;i<childrens.length;i++){
for(let k=0;k<oldData.length;k++){
//遍历原数据oldData所有个数, 开始匹配条件,若oldData中满足其子节点pid是父节点childrens中id,则临时空数组_childrens需要push相应的属性:value,pid,id
if(childrens[i].id === oldData[k].pid){
_childrens.push({
value:oldData[k].labelName,
pid:oldData[k].pid,
id:oldData[k].id
})
//将childrens里添加children属性,并存入子节点集合_childrens,用来标记包含子节点.
childrens[i].children= _childrens;
}
}
//开始循环迭代,执行条件是_childrens临时集合不能为空,如果为空则停止迭代,否则继续迭代,寻找各个条件关系
_childrens.length>0 && recur(_childrens)
}
}
recur(initialData);