tree转数组,我只知道两种方式(有大佬知道其他的告知一下)
1. 递归
2. 循环(注意,循环不能使用迭代器方法,只能使用for循环【迭代器和for循环有区别】)
初始化数据,把数组先转成tree
let arr = [{name: "李四", id: 2, pid: 0},// []
{name: "王五", id: 3, pid: 0}, // []
{name: "赵六", id: 4, pid: 3}, // []
{name: "吗六", id: 9, pid: 3}, // []
{name: "张三", id: 7, pid: 9}, // []
{name: "张五", id: 10, pid: 4}, // []
]
function ArrayToTree(arr, pid = 0) {
// 判断 arr 是否是数组
if (!Array.isArray(arr) || !arr.length) return []
let newArr = []
arr.forEach(v => {
// 判断 pid 是否相同 相同就插入进去,切递归一下children,有值就继续递归,没值就返回[]
if (v.pid == pid) {
newArr.push({
...v, children: ArrayToTree(arr, v.id)
})
}
})
// 返回值
return newArr
}
let tree = ArrayToTree(arr)
- tree转数组,循环模式,每次增加循环的变量
【注意:】只能使用for 循环,不能使用es6的迭代器
function TreeToArrayFor(tree) {
if (!Array.isArray(tree) || !tree.length) throw new Error("请传入数组")
for (let i = 0; i < tree.length; i++) {
if (tree[i].children) {
// 每次children有值,就把值合并到原始数据tree上去,增加原始tree,for 循环 的长度也会增加 依次处理...
tree = tree.concat(tree[i].children)
}
}
return tree
}
2. tree转数组,递归模式
function TreeToArray(tree) {
// 判断 tree 是否有值,无返回 []
if (!Array.isArray(tree) || !tree.length) return []
let res = []
tree.forEach(v => {
// tree的每个元素都 放入到 res里面
res.push(v)
if (v.children) {
// 有children 就把 children数据递归 返回 依次放到 res里面
res.push(...TreeToArray(v.children))
}
})
return res
}