树形结构数据条件过滤

将一个数据库条目过滤id为指定树

需求

  • 自下向上的多条树形结构数据,反转合并成一条或多条自上向下树形结构
  • 已知多个数据的id,得出所有的上级,之后再反转
  • 原始数据 规则:每条数据的pid是唯一的
arr = [{id:1,pid:0},
{id:2,pid:1},
{id:3,pid:2},
{id:4,pid:3},
{id:5,pid:3},
{id:6,pid:2},
{id:7,pid:1}]

已知 id为3,7过滤,需要得到结果为
3->2->1->0
7->1->0

[
    {
        id:1,
        pid:0,
        children:[
            {
                id:2,
                pid:1,
                children:[
                    {
                        {id:3,pid:2}
                    }
                ]
            },
            {
                id:7,
                pid:1
            }
        ]
    }
]

思路

  1. 根据数据源构建树结构,每个节点只有一个父节点,换而言之遍历单向给当前节点添加符合条件子节点
  2. 节点数据修改需要找到指定嵌套子节点位置,同时去掉它的子节点,以及它的同父的兄弟节点

代码


// 1.得到数据源副本
nda = arr.map(v => {
    return { ...v }
})

// 2.建立父子节点关系链
nda.forEach(v => {
    // 找出前节点的子节点
    v.children = nda.filter(child => child.pid == v.id)
    // 裁剪叶子节点
    v.children == 0 && delete v.children
});

function filterTree(nd, ids) {
    // 1.裁剪过滤id指向的节点 使其为叶子节点
    if (ids.includes(nd.id)) {
        nd.children && delete nd.children
    }
    if (nd.children) {
        for (let i = nd.children.length - 1; i >= 0; i--) {
            const element = nd.children[i];
            // 2.回调之前需要先判断是否有下级
            if (element.children) {
                // 3. 移动指针进入下一层
                filterTree(element, ids)
            } else {
                // 4.裁剪同父兄弟节点数据,顺序不可颠倒
                if (!(ids.includes(element.id))) {
                    nd.children.splice(i, 1)
                }
            }
        }
    }
    return
}

测试

let root = nda.find(item => item.id == 1)
filterTree(root, [3, 7])
console.log(JSON.stringify(root, null, 2))

小结

  • 修改之前先查找
  • 嵌套递归
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值