JavaScript 扁平化数据转树状数据,pid —> children

原始数据

const arr = [
    { id: 1, pid: 0, name: "菜单1" },
    { id: 2, pid: 0, name: "菜单2" },
    { id: 3, pid: 0, name: "菜单3" },
    { id: 4, pid: 1, name: "菜单4" },
    { id: 5, pid: 1, name: "菜单5" },
    { id: 6, pid: 2, name: "菜单6" },
    { id: 7, pid: 4, name: "菜单7" },
    { id: 8, pid: 7, name: "菜单8" },
    { id: 9, pid: 8, name: "菜单9" },
    { id: 10, pid: 9, name: "菜单10" },
    { id: 11, pid: 10, name: "菜单11" },
    { id: 12, pid: 11, name: "菜单12" },
    { id: 13, pid: 12, name: "菜单13" },
    { id: 14, pid: 13, name: "菜单14" },
    // 此处省略后面的内容了,可能还有多个........
];

方法一:

const toTree = function(arr){
    const val = []
    const map = {}
    // 复制一个数组 键值对 id : obj
    arr.forEach(item=>{
        map[item.id] = item
    })
    // 遍历现在的数组
    arr.forEach(item=>{
        // 查看是否有他父亲
        const parent = map[item.pid]
        if(parent){
            (parent.children||(parent.children = [])).push(item)
        }else{
            val.push(item)
        }
    })
    return val
}
console.log(toTree(arr));

方法二:

const result = []
function fn(list) {
    const remap = list.reduce((pre, cur) => {  //###第一步:将数组转换成键值对的形式(键是id值,值是对象)
        pre[cur.id] = cur
        return pre
    }, {})
    //###第二步,循环遍历数组,判断是不是(树状结构最外层,祖宗层数据)第一层的数据(本处就是pid等不等于0)
    for (let item of list) {  //用普通的for循环也行,但是用for in 不行,只能获取数组的元素下标,或者对象的键
        if (item.pid === 0) {
            result.push(item)
            continue
        }
        // console.log(remap[item.pid]); //注意 obj[key] 就代表是对象的值value
        if (item.pid in remap) {   //换成else也可,目的将不是第一层的数据(pid不等于0)挑出来,并赋予一个children属性
            const parent = remap[item.pid];
            parent.children = parent.children || [];
            parent.children.push(item);
        }
    }
    return result
}
fn(arr)

保存下来避免 忘记.....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值