go 菜单数组转为树形结构

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)
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

代码工人笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值