树形结构数据转换

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
</body>
</html>
<script>
    var data = [
        { id: 1, name: "办公管理", pid: 0 },
        { id: 2, name: "请假申请", pid: 1 },
        { id: 3, name: "出差申请", pid: 1 },
        { id: 4, name: "请假记录", pid: 2 },
        { id: 5, name: "系统设置", pid: 0 },
        { id: 6, name: "权限管理", pid: 5 },
        { id: 7, name: "用户角色", pid: 6 },
        { id: 8, name: "菜单设置", pid: 6 }
    ]
    // 如果将整个作为一个函数时 避免多次调用, 删除所有的 children
    // data.forEach(function (item) { 
    //     delete item.children
    // })

    // 1. 根据数据判断pid为0是最高父级,依次子级为pid等于id 所以要做对比
    // 2. 以原数组每一项的id作为新数组的key 索引得到第二套数据.但不影响
    let map = []
    data.forEach(function (item) {
        map[item.id] = item
    })
    // 3. 打印结果console.log(map === data), 值为false
    // 4. console.log(map === data)  ---  false
    // 5. 循环原数组中每一项, 如果pid等于id 则当前项为子级, 另一项为父级
    // 6. 新数组map对应的索引为1-8,等于原数组id,这样就可以做出判断.  新数组map[item.pid === key索引值],则这个值等于key索引与之对应的子级
    // 7. 这里理解起来有点绕, 意思就是在循环的时候,将每一项中的pid都作为map新数组的索引,及当循环的pid等于 1 时 { id: 2, name: "请假申请", pid: 1 },{ id: 3, name: "出差申请", pid: 1 }, 
    // 我们就得到了索引为1的map值 { id: 1, name: "办公管理", pid: 0 }
    let val = []
    data.forEach(function (item) {
        // 此时的map[item.pid] 满足索引条件从0开始, 但是map[]里面没有索引为0的数据,只有1-8
        // 接着判断.等到mpa[item.pid] 其中的item.pid === 1 也就是map[1]
        var parent = map[item.pid]
        if (parent) {
            parent.children = []
            parent.children.push(item)
        } 
        else {
            val.push(item)   
        }
    })
    console.log(val)
</script>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值