mirror of
https://github.com/bufanyun/hotgo.git
synced 2025-09-18 01:06:40 +08:00
60 lines
1.5 KiB
Go
60 lines
1.5 KiB
Go
// 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
|
||
}
|