小結:
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
}()
