go的tree转数组

tree转数组,我只知道两种方式(有大佬知道其他的告知一下)
1. 递归
2. 循环(注意,循环不能使用迭代器方法,只能使用for循环【迭代器和for循环有区别】)

初始化数据,把数组先转成tree 

// List 结构体
type List struct {
	Name     string `json:"name"`
	Id       int    `json:"id"`
	Pid      int    `json:"pid"`
	Children []List `json:"children"`
}

// 数据
var data = []List{
	{Name: "李四", Id: 2, Pid: 0},  //  []
	{Name: "王五", Id: 3, Pid: 0},  // []
	{Name: "赵六", Id: 4, Pid: 3},  // []
	{Name: "吗六", Id: 9, Pid: 3},  // []
	{Name: "张三", Id: 7, Pid: 9},  // []
	{Name: "张五", Id: 10, Pid: 4}, // []
}

/**
 * 递归模式,数组转tree
 * @param arr 目标数组
 * @param pid 第一级 目标id
 * @returns {*[]} tree
 * @constructor
 */

func ArrayToTrees(arr []List, pid int) []List {
	var newArr []List
	for _, v := range arr {
		// 判断 pid 是否相同  相同就插入进去,切递归一下children,有值就继续递归,没值就返回[]
		if v.Pid == pid {
			v.Children = ArrayToTrees(arr, v.Id)
			newArr = append(newArr, v)
		}
	}
	return newArr
}

var tree = ArrayToTrees(data, 0)

 1. tree转数组,递归模式

func ArrayToTree(tree []List) []List {
	var res []List
	for _, list := range tree {
		// tree的每个元素都 放入到 res里面
		res = append(res, list)
		if list.Children != nil {
			// 有children 就把 children数据递归 返回  依次放到 res里面
			res = append(res, ArrayToTree(list.Children)...)
		}
	}
	return res
}

2.  tree转数组,循环模式,每次增加循环的变量

【注意:】只能使用for 循环,不能使用es6的迭代器

func TreeToArrayFor(tree []List) []List {
	for i := 0; i < len(tree); i++ {
		if tree[i].Children != nil {
			// 每次children有值,就把值合并到原始数据tree上去,增加原始tree,for 循环 的长度也会增加 依次处理...
			tree = append(tree, tree[i].Children...)
		}
	}
	return tree
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值