golang 將扁平的數據轉為樹形結構


小結:

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
	}()

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM