tree转数组,我只知道两种方式(有大佬知道其他的告知一下)
1. 递归
2. 循环(注意,循环不能使用迭代器方法,只能使用for循环【迭代器和for循环有区别】)
初始化数据,把数组先转成tree
// List 结构体
type List struct {
Name string `json:"name"`
Id int `json:"id"`
Pid int `json:"pid"`
Children []List `json:"children"`
}
// 数据
var data = []List{
{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}, // []
}
/**
* 递归模式,数组转tree
* @param arr 目标数组
* @param pid 第一级 目标id
* @returns {*[]} tree
* @constructor
*/
func ArrayToTrees(arr []List, pid int) []List {
var newArr []List
for _, v := range arr {
// 判断 pid 是否相同 相同就插入进去,切递归一下children,有值就继续递归,没值就返回[]
if v.Pid == pid {
v.Children = ArrayToTrees(arr, v.Id)
newArr = append(newArr, v)
}
}
return newArr
}
var tree = ArrayToTrees(data, 0)
1. tree转数组,递归模式
func ArrayToTree(tree []List) []List {
var res []List
for _, list := range tree {
// tree的每个元素都 放入到 res里面
res = append(res, list)
if list.Children != nil {
// 有children 就把 children数据递归 返回 依次放到 res里面
res = append(res, ArrayToTree(list.Children)...)
}
}
return res
}
2. tree转数组,循环模式,每次增加循环的变量
【注意:】只能使用for 循环,不能使用es6的迭代器
func TreeToArrayFor(tree []List) []List {
for i := 0; i < len(tree); i++ {
if tree[i].Children != nil {
// 每次children有值,就把值合并到原始数据tree上去,增加原始tree,for 循环 的长度也会增加 依次处理...
tree = append(tree, tree[i].Children...)
}
}
return tree
}