算法:tree转数组 - 前端笔记-tree转数组,两种方式 1. 递归 2. 循环(注意,循环不能使用迭代器方法,只能使用for循环) js版本 初始化数据 /** * 数组 */ let arr = [{name...

学习笔记

点滴记忆
回忆过往
首页>> 算法 >>算法:tree转数组 - 前端笔记
2022-8-12
分类: 算法

算法:tree转数组

文章作者:痴迷

tree转数组,两种方式 1. 递归 2. 循环(注意,循环不能使用迭代器方法,只能使用for循环) js版本 初始化数据 /** * 数组 */ let arr = [{name: "李四"......

tree转数组,两种方式
1. 递归
2. 循环(注意,循环不能使用迭代器方法,只能使用for循环)

js版本

初始化数据
/**
 * 数组
 */
let arr = [{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
 * @returns {*[]}
 * @constructor
 */
function ArrayToTree(arr, pid = 0) {
    // 判断 arr 是否是数组
    if (!Array.isArray(arr) || !arr.length) return []
    let newArr = []
    arr.forEach(v => {
        // 判断 pid 是否相同  相同就插入进去,切递归一下children,有值就继续递归,没值就返回[]
        if (v.pid == pid) {
            newArr.push({
                ...v, children: ArrayToTree(arr, v.id)
            })
        }
    })
    // 返回值
    return newArr
}

let tree = ArrayToTree(arr)
1. tree转数组,循环模式,每次增加循环的变量
/**
 * tree转数组,循环模式,每次增加循环的变量
 * 【注意:】只能使用for 循环,不能使用es6的迭代器
 * @param tree
 * @returns {{length}|*}
 * @constructor
 */
function TreeToArrayFor(tree) {
    if (!Array.isArray(tree) || !tree.length) throw new Error("请传入数组")
    for (let i = 0; i < tree.length; i++) {
        if (tree[i].children) {
            // 每次children有值,就把值合并到原始数据tree上去,增加原始tree,for 循环 的长度也会增加 依次处理...
            tree = tree.concat(tree[i].children)
        }
    }
    return tree
}
2. tree转数组,递归模式
/**
 * tree转数组,递归模式
 * @param tree
 * @returns {*[]}
 * @constructor
 */
function TreeToArray(tree) {
    // 判断 tree 是否有值,无返回 []
    if (!Array.isArray(tree) || !tree.length) return []
    let res = []
    tree.forEach(v => {
        // tree的每个元素都 放入到 res里面
        res.push(v)
        if (v.children) {
            // 有children 就把 children数据递归 返回  依次放到 res里面
            res.push(...TreeToArray(v.children))
        }
    })
    return res
}
go版本

初始化数据
// 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转数组,递归模式
/**
 * tree转数组,递归模式
 * @param tree
 * @returns {*[]}
 * @constructor
 */

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转数组,循环模式,每次增加循环的变量
/**
 * tree转数组,循环模式,每次增加循环的变量
 * 【注意:】只能使用for 循环,不能使用es6的迭代器
 * @param tree
 * @returns {{length}|*}
 * @constructor
 */

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
}



×

感谢您的支持,我们会一直保持!

扫码支持
请土豪扫码随意打赏

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

打赏作者
版权所有,转载注意明处:前端笔记 » 算法:tree转数组

网友评论(0)