package
1.8.8
Repository: https://github.com/fzf-labs/fpkg.git
Documentation: pkg.go.dev

# README

树形结构数据封装

package tree

type Tree struct {
	ID    int         `json:"id"`
	Pid   int         `json:"pid"`
	Data  any `json:"data"`
	Child []Tree      `json:"child"`
}

type Trees []Tree

func (t Trees) Len() int {
	return len(t)
}

func (t Trees) Less(i, j int) bool {
	return t[i].ID < t[j].ID
}

func (t Trees) Swap(i, j int) {
	t[i], t[j] = t[j], t[i]
}

func GenerateTree(list []Tree) []Tree {
	var trees []Tree
	// Define the top-level root and child nodes
	var roots, childs []Tree
	for _, v := range list {
		if v.Pid == 0 {
			// Determine the top-level root node
			roots = append(roots, v)
		}
		childs = append(childs, v)
	}

	for _, v := range roots {
		childTree := &Tree{
			ID:    v.ID,
			Pid:   v.Pid,
			Data:  v.Data,
			Child: make([]Tree, 0),
		}
		// recursive
		recursiveTree(childTree, childs)

		trees = append(trees, *childTree)
	}
	return trees
}

func GenerateRootTree(list []Tree, id int) Tree {
	var tree Tree
	trees := GenerateTree(list)
	for _, v := range trees {
		if v.ID == id {
			tree = v
			break
		}
	}
	return tree
}

func recursiveTree(tree *Tree, allNodes []Tree) {
	for _, v := range allNodes {
		if v.Pid == 0 {
			// If the current node is the top-level root node, skip
			continue
		}
		if tree.ID == v.Pid {
			childTree := &Tree{
				ID:    v.ID,
				Pid:   v.Pid,
				Data:  v.Data,
				Child: make([]Tree, 0),
			}
			recursiveTree(childTree, allNodes)
			tree.Child = append(tree.Child, *childTree)
		}
	}
}

// FindSubNode 查询子级
func FindSubNode(node *Tree, allNodes []Tree) {
	for _, v := range allNodes {
		if node.ID == v.Pid {
			FindSubNode(&v, allNodes)
			node.Child = append(node.Child, v)
		}
	}
}

// FindParentNode 查询父级
func FindParentNode(node *Tree, allNodes []Tree) {
	for _, v := range allNodes {
		temp := v
		if node.Pid == temp.ID {
			temp.Child = append(temp.Child, *node)
			*node = temp
			FindParentNode(node, allNodes)
		}
	}
}

func TreeRange(trees []Tree) {
	for _, v := range trees {
		if len(v.Child) > 0 {
			TreeRange(v.Child)

		}
	}
}

# Functions

FindRelationSubNode 查询子节点.
GenerateTree 自定义的结构体实现 INode 接口后调用此方法生成树结构 nodes 需要生成树的节点 selectedNode 生成树后选中的节点 menuTrees 生成成功后的树结构对象.

# Structs

Tree 统一定义菜单树的数据结构,也可以自定义添加其他字段.

# Interfaces

INode 其他的结构体想要生成菜单树,直接实现这个接口.

# Type aliases

No description provided by the author