golang生成分组树状结构

2023-05-16

1.需求: 获取分组导航树

在这里插入图片描述

2.实现

package main

import (
	"encoding/json"
	"fmt"
	"strings"
)

type Group struct {
	Id              int      `json:"id"`
	Alias           string   `json:"alias"`
	FullAlias       string   `json:"fullAlias"`
	ParentId        int      `json:"parentId"`
	ParentAlias     string   `json:"parentAlias"`
	ParentFullAlias string   `json:"parentFullAlias"`
	Children        []*Group `json:"children"`
}

func getTreeRecursive(list []*Group, parentId int, parentAlias string) []*Group {
	res := make([]*Group, 0)
	for _, v := range list {
		if v.ParentId == parentId {
			if parentAlias != "" {
				v.FullAlias = parentAlias + "/" + v.Alias
			} else {
				v.FullAlias = v.Alias
			}
			v.ParentFullAlias = parentAlias
			fullList := strings.Split(v.FullAlias, "/")
			if len(fullList) >= 2 {
				v.ParentAlias = fullList[len(fullList)-2]
			} else {
				v.ParentAlias = parentAlias
			}
			v.Children = getTreeRecursive(list, v.Id, v.FullAlias)
			// 用 alias 排序,alias相等的元素保持原始顺序
			sort.SliceStable(v.Children, func(i, j int) bool {
				return v.Children[i].Alias < v.Children[j].Alias
			})
			res = append(res, v)
		}
	}
	// 用 alias 排序,alias相等的元素保持原始顺序
	sort.SliceStable(res, func(i, j int) bool {
		return res[i].Alias < res[j].Alias
	})
	return res
}


func main() {
	list := []*Group{
		{1, "FPF引擎", "", 0, "", "", []*Group{}},
		{2, "IDP引擎", "", 0, "", "", []*Group{}},
		{3, "桂妃山", "", 1, "", "", []*Group{}},
		{4, "南沙", "", 1, "", "", []*Group{}},
		{5, "大边", "", 1, "", "", []*Group{}},
		{6, "一场", "", 3, "", "", []*Group{}},
		{9, "一线", "", 6, "", "", []*Group{}},
		{7, "二场", "", 3, "", "", []*Group{}},
		{10, "一线", "", 7, "", "", []*Group{}},
		{8, "洗消中心", "", 5, "", "", []*Group{}},
	}
	res := getTreeRecursive(list, 0, "")

	bytes, _ := json.MarshalIndent(res, "", "    ")
	fmt.Printf("%s\n", bytes)

}

结果示例:

[
    {
        "id": 1,
        "alias": "FPF引擎",
        "fullAlias": "FPF引擎",
        "parentId": 0,
        "parentAlias": "",
        "parentFullAlias": "",
        "children": [
            {
                "id": 3,
                "alias": "桂妃山",
                "fullAlias": "FPF引擎/桂妃山",
                "parentId": 1,
                "parentAlias": "FPF引擎",
                "parentFullAlias": "FPF引擎",
                "children": [
                    {
                        "id": 6,
                        "alias": "一场",
                        "fullAlias": "FPF引擎/桂妃山/一场",
                        "parentId": 3,
                        "parentAlias": "桂妃山",
                        "parentFullAlias": "FPF引擎/桂妃山",
                        "children": [
                            {
                                "id": 9,
                                "alias": "一线",
                                "fullAlias": "FPF引擎/桂妃山/一场/一线",
                                "parentId": 6,
                                "parentAlias": "一场",
                                "parentFullAlias": "FPF引擎/桂妃山/一场",
                                "children": []
                            }
                        ]
                    },
                    {
                        "id": 7,
                        "alias": "二场",
                        "fullAlias": "FPF引擎/桂妃山/二场",
                        "parentId": 3,
                        "parentAlias": "桂妃山",
                        "parentFullAlias": "FPF引擎/桂妃山",
                        "children": [
                            {
                                "id": 10,
                                "alias": "一线",
                                "fullAlias": "FPF引擎/桂妃山/二场/一线",
                                "parentId": 7,
                                "parentAlias": "二场",
                                "parentFullAlias": "FPF引擎/桂妃山/二场",
                                "children": []
                            }
                        ]
                    }
                ]
            },
            {
                "id": 4,
                "alias": "南沙",
                "fullAlias": "FPF引擎/南沙",
                "parentId": 1,
                "parentAlias": "FPF引擎",
                "parentFullAlias": "FPF引擎",
                "children": []
            },
            {
                "id": 5,
                "alias": "大边",
                "fullAlias": "FPF引擎/大边",
                "parentId": 1,
                "parentAlias": "FPF引擎",
                "parentFullAlias": "FPF引擎",
                "children": [
                    {
                        "id": 8,
                        "alias": "洗消中心",
                        "fullAlias": "FPF引擎/大边/洗消中心",
                        "parentId": 5,
                        "parentAlias": "大边",
                        "parentFullAlias": "FPF引擎/大边",
                        "children": []
                    }
                ]
            }
        ]
    },
    {
        "id": 2,
        "alias": "IDP引擎",
        "fullAlias": "IDP引擎",
        "parentId": 0,
        "parentAlias": "",
        "parentFullAlias": "",
        "children": []
    }
]

3. 额外获取每个分组对应的父分组信息及分组的层级名称全称

package main

import (
	"encoding/json"
	"fmt"
	"strings"
)

type Group struct {
	Id              int      `json:"id"`
	Alias           string   `json:"alias"`
	FullAlias       string   `json:"fullAlias"`
	ParentId        int      `json:"parentId"`
	ParentAlias     string   `json:"parentAlias"`
	ParentFullAlias string   `json:"parentFullAlias"`
	Children        []*Group `json:"children"`
}

func getTreeRecursive(list []*Group, parentId int, parentAlias string) []*Group {
	res := make([]*Group, 0)
	for _, v := range list {
		if v.ParentId == parentId {
			if parentAlias != "" {
				v.FullAlias = parentAlias + "/" + v.Alias
			} else {
				v.FullAlias = v.Alias
			}
			v.ParentFullAlias = parentAlias
			fullList := strings.Split(v.FullAlias, "/")
			if len(fullList) >= 2 {
				v.ParentAlias = fullList[len(fullList)-2]
			} else {
				v.ParentAlias = parentAlias
			}
			v.Children = getTreeRecursive(list, v.Id, v.FullAlias)
			// 用 alias 排序,alias相等的元素保持原始顺序
			sort.SliceStable(v.Children, func(i, j int) bool {
				return v.Children[i].Alias < v.Children[j].Alias
			})
			res = append(res, v)
		}
	}
	// 用 alias 排序,alias相等的元素保持原始顺序
	sort.SliceStable(res, func(i, j int) bool {
		return res[i].Alias < res[j].Alias
	})
	return res
}

func getGroupMapper(group []*Group, re map[int]map[string]interface{}) map[int]map[string]interface{} {
	for _, v := range group {
		temp := map[string]interface{}{
			"alias":           v.Alias,
			"fullAlias":       v.FullAlias,
			"parentFullAlias": v.ParentFullAlias,
			"parentId":        v.ParentId,
			"parentAlias":     v.ParentAlias,
		}
		re[v.Id] = temp
		if len(v.Children) > 0 {
			getGroupMapper(v.Children, re)
		}
	}
	return re
}

// 检查指定父分组下是否有重名的子分组名称
func findChildAlias(alias string, parentId int, tree []*Group) bool {
	var res bool
	for _, v := range tree {
		if v.ParentId == parentId {
			if v.Alias == alias {
				res = true
				break
			} else {
				continue
			}
		}else{
			res = findChildAlias(alias, parentId, v.Children)
		}
	}
	return res
}

func main() {
	list := []*Group{
		{1, "FPF引擎", "", 0, "", "", []*Group{}},
		{2, "IDP引擎", "", 0, "", "", []*Group{}},
		{3, "桂妃山", "", 1, "", "", []*Group{}},
		{4, "南沙", "", 1, "", "", []*Group{}},
		{5, "大边", "", 1, "", "", []*Group{}},
		{6, "一场", "", 3, "", "", []*Group{}},
		{9, "一线", "", 6, "", "", []*Group{}},
		{7, "二场", "", 3, "", "", []*Group{}},
		{10, "一线", "", 7, "", "", []*Group{}},
		{8, "洗消中心", "", 5, "", "", []*Group{}},
	}
	res := getTreeRecursive(list, 0, "")

	bytes, _ := json.MarshalIndent(res, "", "    ")
	fmt.Printf("%s\n", bytes)

	cacheMap := getGroupMapper(res, map[int]map[string]interface{}{})
	bytes2, _ := json.MarshalIndent(cacheMap, "", "    ")
	fmt.Printf("%s\n", bytes2)
}
	fmt.Println(findChildAlias("FPF引擎",0, tree))  // true
	fmt.Println(findChildAlias("桂妃山",1, tree))  // true
	fmt.Println(findChildAlias("桂妃山1",1, tree))  // false
	fmt.Println(findChildAlias("一场",3, tree))  // true
	fmt.Println(findChildAlias("一场1",3, tree))  // false
	fmt.Println(findChildAlias("一线",6, tree))  // true
	fmt.Println(findChildAlias("一线1",6, tree))  // false

结果示例:

{
    "1": {
        "alias": "FPF引擎",
        "fullAlias": "FPF引擎",
        "parentAlias": "",
        "parentFullAlias": "",
        "parentId": 0
    },
    "10": {
        "alias": "一线",
        "fullAlias": "FPF引擎/桂妃山/二场/一线",
        "parentAlias": "二场",
        "parentFullAlias": "FPF引擎/桂妃山/二场",
        "parentId": 7
    },
    "2": {
        "alias": "IDP引擎",
        "fullAlias": "IDP引擎",
        "parentAlias": "",
        "parentFullAlias": "",
        "parentId": 0
    },
    "3": {
        "alias": "桂妃山",
        "fullAlias": "FPF引擎/桂妃山",
        "parentAlias": "FPF引擎",
        "parentFullAlias": "FPF引擎",
        "parentId": 1
    },
    "4": {
        "alias": "南沙",
        "fullAlias": "FPF引擎/南沙",
        "parentAlias": "FPF引擎",
        "parentFullAlias": "FPF引擎",
        "parentId": 1
    },
    "5": {
        "alias": "大边",
        "fullAlias": "FPF引擎/大边",
        "parentAlias": "FPF引擎",
        "parentFullAlias": "FPF引擎",
        "parentId": 1
    },
    "6": {
        "alias": "一场",
        "fullAlias": "FPF引擎/桂妃山/一场",
        "parentAlias": "桂妃山",
        "parentFullAlias": "FPF引擎/桂妃山",
        "parentId": 3
    },
    "7": {
        "alias": "二场",
        "fullAlias": "FPF引擎/桂妃山/二场",
        "parentAlias": "桂妃山",
        "parentFullAlias": "FPF引擎/桂妃山",
        "parentId": 3
    },
    "8": {
        "alias": "洗消中心",
        "fullAlias": "FPF引擎/大边/洗消中心",
        "parentAlias": "大边",
        "parentFullAlias": "FPF引擎/大边",
        "parentId": 5
    },
    "9": {
        "alias": "一线",
        "fullAlias": "FPF引擎/桂妃山/一场/一线",
        "parentAlias": "一场",
        "parentFullAlias": "FPF引擎/桂妃山/一场",
        "parentId": 6
    }
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

golang生成分组树状结构 的相关文章

  • Mbot ros编译环境安装

    x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 x1f448 x1f448 x1f448 文章目录 61 61 x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 https it
  • Ubuntu系统迁移

    文章目录 前言一 备份系统二 制作系统盘三 安装系统 前言 本博客记录如何将一个电脑 板卡 xff08 或虚拟机 xff09 的ubuntu系统原封不动的迁移到另一个电脑 板卡 xff08 或虚拟机 xff09 上 Ubuntu20 04系
  • ubuntu20.04搭建QGC4.2编译环境

    文章目录 前言 一 安装qt 二 编译QGC 安装依赖 安装GStreamer 三 编译安卓版QGC 安装jdk11 配置Qt creator 配置手机 配置遥控器 常见报错 前言 Ubuntu20 04 QGC 4 2 ubuntu18
  • PX4实战之旅(三):通过OFFBOARD模式控制无人机自主飞行

    文章目录 前言 一 添加自定义模块 二 测试 前言 固件 PX4 1 13 1 一 添加自定义模块 在PX4 Autopilot src modules目录下新建control node文件夹 在control node文件夹下新建下面四个
  • QGC二次开发基础

    文章目录 前言 一 添加文件到QGC工程 二 添加界面 三 QML和C 交互 四 信号与槽 五 测试 前言 QGC 4 2 4 一 添加文件到QGC工程 在qgroundcontrol src目录下创建SimpleTest文件夹 在文件夹中
  • windos10安装QGC4.2编译环境

    文章目录 前言一 安装VS二 安装QT三 编译四 常见报错及解决办法 前言 参考链接 https dev qgroundcontrol com master en getting started 一 安装VS 下载地址 xff1a http
  • PX4入门指南

    x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 x1f448 x1f448 x1f448 文章目录 61 61 x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 https it
  • PX4基本配置

    目录 下载固件 下载原生稳定版固件 安装PX4 Master Beta或自定义固件 FMUv2 Bootloader 更新 机架设置 飞行控制器 传感器方向 计算朝向 设置朝向 罗盘校准 执行校准 陀螺仪校准 执行校准 加速度计 执行校准
  • VNCVIEW以LXDE环境连接Ubuntu12.04

    问题 xff1a 之前装了好几个桌面环境 xff0c 连接时只默认使用第一个桌面环境 xff0c 表示很郁闷 之前总以为命令是lxde开头的 xff0c 刚才又搜索了一下 xff0c 发现是startlxde 编辑 vnc xstartup
  • PX4飞行测试

    x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 x1f448 x1f448 x1f448 文章目录 61 61 x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 https it
  • PX4飞行模式

    x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 x1f448 x1f448 x1f448 文章目录 61 61 x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 https it
  • PX4实战之旅(五):利用T265实现室内定点飞行

    文章目录 前言一 相机安装二 安装Realsense驱动三 安装VIO桥接包四 配置摄像头方向五 运行VIO六 通过MAVROS连接地面站PX4设置 前言 硬件 xff1a Intel NUC Intel Realsense T265 Pi
  • windos安装mission planner地面站

    官网地址 https ardupilot org planner 可以直接点击下载 或者从网盘下载 链接 xff1a https pan baidu com s 1SkMIzohJRO25GWbo J944A 提取码 xff1a nw1s
  • PX4从放弃到精通(二十七):固定翼姿态控制

    x1f449 x1f449 x1f449 无人机硬件 xff0c 提供全程指导 x1f448 x1f448 x1f448 前言 固件版本 PX4 1 13 2 欢迎交流学习 xff0c 可加左侧名片 一 roll pitch姿态 角速率控制
  • PX4无人机调参

    文章目录 前言 一 滤波参数 二 PID参数 自动调参 手动调参 角速率环 姿态环 前言 PX4 1 13 2 日志分析软件 flight review https logs px4 io 一 滤波参数 调参时可以用自稳模式飞行 在调滤波器
  • Postman学习(一)下载安装与汉化教程

    1 postman下载 下载网址 xff1a Download Postman 打开网址 xff0c 下载64位安装包 2 postman安装 打开安装包后默认安装成功 xff0c 默认安装地址是 xff1a C Users 用户名 App
  • (UART/SPI/IIC) 与 (WIFI/蓝牙/Zigbee) 与 (TCP/IP/UDP)等协议精讲

    这三块内容有相同的地方 xff0c 也有不同的地方 xff0c 使用过程中密不可分 就一块单片机来讲 xff1a 其板子上主控芯片 xff08 MCU xff09 和其他芯片之间 xff0c 通信属于用的是UART SPI IIC等协议 x
  • IIC总线最多可以挂多少个设备

    由IIC地址决定 xff0c 8位地址 xff0c 减去1位广播地址 xff0c 是7位地址 xff0c 2 7 61 128 xff0c 但是地址0x00不用 xff0c 那就是127个地址 xff0c 所以理论上可以挂127个从器件 但
  • TortoiseGit 安装使用

    1 首先安装 windows版的git xff08 类似linux的命令行工具 xff09 Git for Windows 反正安装我除了路径都是选下一步的 Git安装教程 xff08 windows xff09 战争热诚 博客园 安装完之
  • ORB-SLAM3结合RealSense D455相机实时运行&离线官方样例测试部署

    文章目录 前言编译环境配置环境1 C 43 43 112 Pangolon3 Eigen34 DBoW2 and g2o5 ORB SLAM36 ROS7 librealsense8 相机驱动realsense ros9 ROS测试环境10

随机推荐