小结:
1、借助指针,2个循环搞定;
2、支持无限层级的树状结构。
type T struct { domain.VOGoodsCat Children []*T } flat := func() []domain.VOGoodsCat { flat := []domain.VOGoodsCat{} for _, v := range out.List { u := domain.VOGoodsCat{} u.ParentId = v.ParentId u.CategoryId = v.CategoryId u.ParentId = v.ParentId u.Name = v.Name flat = append(flat, u) } return flat }() treeList := func() []T { // TODO 族谱树 多叉树 treeList := []T{} flatPtr := []T{} for _, i := range flat { t := T{} t.CategoryId = i.CategoryId t.ParentId = i.ParentId t.Name = i.Name t.Children = []*T{} flatPtr = append(flatPtr, t) } for m := range flatPtr { for n := range flatPtr { if flatPtr[m].CategoryId == flatPtr[n].ParentId { flatPtr[m].Children = append(flatPtr[m].Children, &flatPtr[n]) } } } for _, j := range flatPtr { if j.ParentId == -1 { treeList = append(treeList, j) } } return treeList }()
如果Children无数据,从返回空数组调整为null
[]*T -->> *[]*T nil
type T struct { domain.VOGoodsCat Children *[]*T } flat := func() []domain.VOGoodsCat { flat := []domain.VOGoodsCat{} for _, v := range out { u := domain.VOGoodsCat{} u.ParentId = v.ParentId u.CategoryId = v.CategoryId u.ParentId = v.ParentId u.Name = v.Name flat = append(flat, u) } return flat }() treeList := func() []T { // TODO 族谱树 多叉树 treeList := []T{} flatPtr := []T{} for _, i := range flat { t := T{} t.CategoryId = i.CategoryId t.ParentId = i.ParentId t.Name = i.Name t.Children = nil flatPtr = append(flatPtr, t) } for m := range flatPtr { for n := range flatPtr { if flatPtr[m].CategoryId == flatPtr[n].ParentId { if flatPtr[m].Children == nil { flatPtr[m].Children = &[]*T{} } *(flatPtr[m].Children) = append(*(flatPtr[m].Children), &flatPtr[n]) } } } for _, j := range flatPtr { if j.ParentId == -1 { treeList = append(treeList, j) } } return treeList }()