js的tree转数组

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

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

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}, // []
]

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转数组,循环模式,每次增加循环的变量

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

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转数组,递归模式

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
}


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值