1.递归方法
// 将列表型数据转化成树形数据 => 递归算法 =>自身调用自身=> 一定条件不能一样否则死循环 // 遍历树形,有一个重点:有一个头 export function tranListIoTreeData(list, rootvalue) { // 首先rootvalue为空(不一定是空,根据返回的数据来决定),找到了根节点,然后把根节点的id给rootvalue,再找pid=rootvalue的,全部加入一个对象中; const arr = [] list.forEach(item => { if (item.pid === rootvalue) { // 找到根节点后,看根节点后有没有子节点 const children = tranListIoTreeData(list, item.id) if (children.length) { item.children = children } arr.push(item)// 内容加入数组中 } }) return arr }
2.非递归
非递归的形式 数组装换成树状图 //将根元素和根元素的第一个层子元素追加,在遍历到非根元素时,将其追加到它的父元素下. var arr = [ { id: 2, pid: 1}, { id: 1, pid: 0}, 列表转树 不使用递归方式 function list2tree(list){ const arr =[] list.forEach((v)=>{ //获取一个不包含当前项的新数组 const newList = list.filter((k)=>k.id !==v.id); //如果没有找到这一项的父元素那么可以确定它是根元素 const root = newList.find((t)=>t.id === v.pid); if(!root){ //往数组中追加根元素 arr.push(v) } //找当前项的子元素 此步骤完成了给多层子元素追加进去的功能,因为最开始foreach遍历的项,如果不是根元素,那么也会去找他的子元素追加进这个项. const children = newList.filter((k)=>k.pid === v.id); //找到了就赋值 if(children.length>0){ v.children = children }else{ v.children = [] } }); return arr; } const list = list2tree(arr)