菜单展示的递归与非递归形式实现 (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 加入
还未添加个人简介











评论