mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-10-11 20:43:44 +08:00
v2.0
This commit is contained in:
59
server/utility/tree/tree.go
Normal file
59
server/utility/tree/tree.go
Normal file
@@ -0,0 +1,59 @@
|
||||
// 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
|
||||
}
|
Reference in New Issue
Block a user