go 菜单数组转为树形结构
- 菜单结构体
type MenuItem struct {
ID int `json:"id"`
ParentID int `json:"parent_id"`
Name string `json:"name"`
Children []*MenuItem `json:"children,omitempty"`
}
- 数组转树
func ArrayToTree(menuItems []MenuItem) []*MenuItem {
// 创建一个map用于快速查找节点
lookup := make(map[int]*MenuItem)
var rootItems []*MenuItem
for i := range menuItems {
item := &menuItems[i]
lookup[item.ID] = item
if item.ParentID == 0 {
// 如果ParentID是0,则认为它是根节点
rootItems = append(rootItems, item)
} else {
// 查找父节点并添加当前节点为其子节点
if parent, found := lookup[item.ParentID]; found {
parent.Children = append(parent.Children, item)
}
}
}
return rootItems
}
- 示例
func main() {
var menus = []MenuItem{
{ID: 1, ParentID: 0, Name: "首页"},
{ID: 2, ParentID: 0, Name: "产品"},
{ID: 3, ParentID: 2, Name: "电子产品"},
{ID: 4, ParentID: 2, Name: "家居用品"},
{ID: 5, ParentID: 3, Name: "手机"},
{ID: 6, ParentID: 1, Name: "关于我们"},
}
tree := ArrayToTree(menus)
// 这里可以添加代码来验证或展示构建的树结构
// 比如打印整个树结构
printMenuTree(tree, 0)
}
func printMenuTree(items []*MenuItem, level int) {
for _, item := range items {
fmt.Println(strings.Repeat("--", level) + item.Name)
printMenuTree(item.Children, level+1)
}
}