hotgo/server/utility/tree/tree.go
2022-11-24 23:37:34 +08:00

60 lines
1.5 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Package tree
// @Link https://github.com/bufanyun/hotgo
// @Copyright Copyright (c) 2022 HotGo CLI
// @Author Ms <133814250@qq.com>
// @License https://github.com/bufanyun/hotgo/blob/master/LICENSE
//
package tree
import (
"github.com/gogf/gf/v2/util/gconv"
)
var pidName = "pid"
// GenTree 生成关系树 参考https://blog.csdn.net/weixin_51546892/article/details/122876793
func GenTree(menus []map[string]interface{}) (realMenu []map[string]interface{}) {
if len(menus) < 1 {
return nil
}
minPid := GetMinPid(menus)
formatMenu := make(map[int]map[string]interface{})
for _, m := range menus {
formatMenu[gconv.Int(m["id"])] = m
if gconv.Int(m[pidName]) == minPid {
realMenu = append(realMenu, m) // 需要返回的顶级菜单
}
}
// 得益于都是地址操作,可以直接往父级塞
for _, m := range formatMenu {
if formatMenu[gconv.Int(m[pidName])] == nil {
continue
}
if formatMenu[gconv.Int(m[pidName])]["children"] == nil {
formatMenu[gconv.Int(m[pidName])]["children"] = []map[string]interface{}{}
}
formatMenu[gconv.Int(m[pidName])]["children"] = append(formatMenu[gconv.Int(m[pidName])]["children"].([]map[string]interface{}), m)
}
return
}
func GetMinPid(menus []map[string]interface{}) int {
index := -1
for _, m := range menus {
if index == -1 {
index = gconv.Int(m[pidName])
continue
}
if gconv.Int(m[pidName]) < index {
index = gconv.Int(m[pidName])
}
}
if index == -1 {
return 0
}
return index
}