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