实现内容:
1、家谱树:寻找根节点, 最高层级的id;
2、寻找到根节点ID之后, 用递归的方法实现树状图;
3、将生成的树状图用递归的方法展开成一维有关系的数组(未生成树之前的数据格式)。
let list = [ // 网上随意找的一个有关系的数组变量
{id: 1, name: '动物', pid: 0},
{id: 2, name: '鸟类', pid: 5},
{id: 3, name: '无脊椎动物', pid: 1},
{id: 4, name: '哺乳动物', pid: 5},
{id: 5, name: '脊椎动物', pid: 1},
{id: 6, name: '喜鹊', pid: 2},
{id: 7, name: '蚯蚓', pid: 3}
];
1、寻找根节点
function findPid(list, pid) {
let obj = list.find(item => item.id === pid);
return obj ? findPid(list, obj.pid) : pid
}
2、用递归实现树状结构
function tree(list, pid) {
let arr = list.filter(item => item.pid === pid);
if (arr.length === 0) {
return null
} else {
arr.forEach(item => {
if (tree(list, item.id) !== null) {
item.children = tree(list, item.id)
}
})
}
return arr
}
let resultArr = tree(list, findPid(list, 5)); // 5为list中任意一条数据的pid
3、递归实现遍历树结构
function allList(arr, list1 = []) {
arr.forEach(item => {
list1.push(item);
if (item.children && item.children.length > 0) {
allList(item.children, list1)
}
});
// 原来的数据里面没有children属性
list1.forEach(item => delete item.children);
return list1
}
console.log(allList(resultArr))
我自己也是在练习,如果有好的建议,欢迎留言区留言。