数组转 tree目前发现就二种方式,go实现了两种
1. 递归模式
2. 双重循环
初始化数据
// 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}, // []
}
1. 递归模式
/**
* 递归模式,数组转tree
* @param arr 目标数组
* @param pid 第一级 目标id
* @returns {*[]} tree
* @constructor
*/
func ArrayToTree(arr []List, pid int) []List {
var newArr []List
for _, v := range arr {
if v.Pid == pid {
v.Children = ArrayToTree(arr, v.Id)
newArr = append(newArr, v)
}
}
return newArr
}
2. 双重for循环模式
/**
* 双重for循环模式,数组转tree
* @param arr
* @returns {any}
* [
* { name: '李四', id: 2, pid: 0 },
* { name: '王五', id: 3, pid: 0, children: [ [Object], [Object] ] }
* ]
*/
func arrToTreeArray(arr []List, pid int) []List {
var res = arr
for i, item := range arr {
var newArr = []List{}
for _, v := range arr {
if item.Id == v.Pid {
newArr = append(newArr, v)
}
}
res[i].Children = newArr
}
var result []List
for _, item := range res {
if item.Pid == pid {
result = append(result, item)
}
}
return result
}