菜单展示的递归与非递归形式实现 (go 语言版)
发布于: 2021 年 02 月 23 日
1.递归形式实现
节点分为三种:根节点、中间节点、叶子节点,其中一个树可以有多个根节点
结构体
type MenuTree struct {
Name string `json:"name"`
ID string `json:"id"`
Description string `json:"description"`
ParentID string `json:"parentId"`
HeaderGroupID string `json:"headerGroupId"`//用于记录该节点所属的根节点,可以便于查找指定根节点的所有child
Children []*MenuTree `json:"childrens"`
}
复制代码
获取指定节点的叶子节点
func GetNodeLeafIds(menuTree *MenuTree, nodeID string) []string {
node := findNode(menuTree, nodeID)
if node == nil {
return nil
}
ids := make([]string, 0)
getLeafIds(node, &ids)
return ids
}
复制代码
查找某一中间节点是否有包含指定节点
func findNode(menuTree *MenuTree, nodeID string) *MenuTree {
if menuTree.ID == nodeID {
return menuTree
}
for _, child := range menuTree.Children {
if child.ID == nodeID {
return child
}
findNode(child, nodeID)
}
return nil
}
复制代码
获取指定节点的所有叶子节点
func getLeafIds(node *MenuTree, lefts *[]string) {
for _, child := range node.Children {
if child.Children == nil || len(child.Children) == 0 {
*lefts = append(*lefts, child.ID)
}
getLeafIds(child, lefts)
}
}
复制代码
获取所有根节点
func getRoots(datas []*MenuTree) []*MenuTree {
roots := []*MenuTree{}
for _, data := range datas {
if data.ParentID == "" {//父节点为空的为根节点
root := MenuTree{
Name : data.Name,
ID : data.ID,
Description : data.Description,
ParentID : data.ParentID,
HeaderGroupID: data.HeaderGroupID,
Children : []*MenuTree{},
}
roots = append(roots, &root)
}
}
return roots
}
复制代码
给指定的根节点构建树,datas 为所有菜单的数据,root 为指定根节点
func buildChild(datas []*MenuTree, root *MenuTree) *MenuTree {
for _, data := range datas {
if data.ParentGroupID == node.DeviceGroupID {
node.Children = append(node.Children, buildChild(datas, data))
}
}
return node
}
复制代码
构建所有根节点的树
func BuildTree(allMenus []*MenuTree) []*MenuTree {
roots := getRoots(allMenus)
for _, root := range roots {
buildChild(allMenus, root)
}
return roots
}
复制代码
2.非递归形式实现
func buildMenuTree(allMenus []*MenuTree ) map[string]*MenuTree {
temp := map[string]*MenuTree{}
result := map[string]*MenuTree{}
for _, menu := range allMenus {
temp[menu.ID] = &menu
}
for _, node := range temp {
if temp[node.ParentID] == nil {
result[node.ID] = node
} else {
temp[node.ParentID].Children = append(temp[node.ParentID].Children, node)
}
}
return result
}
复制代码
划线
评论
复制
发布于: 2021 年 02 月 23 日阅读数: 30
版权声明: 本文为 InfoQ 作者【我的腿腿】的原创文章。
原文链接:【http://xie.infoq.cn/article/92413393a55c71083b023d1f6】。文章转载请联系作者。
我的腿腿
关注
还未添加个人签名 2018.09.18 加入
还未添加个人简介
评论