Java后端根据parentId返回树形结构的数据

本文介绍了一种将扁平化的数据转换成树形结构的方法。通过遍历数据集并使用映射的方式,将子节点关联到其对应的父节点下,最终生成了清晰的树状数据结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在开发中,经常会遇到返回树形结果的数据,那么下面这个例子就是较好的学习案例.

返回以下形式的树形结构返回结果:

{
    "data": [
        {
            "children": [
                {
                    "dictId": 100,
                    "dictName": "立项",
                    "dictType": 1,
                    "isEdit": 0,
                    "parentId": 1
                }
            ],
            "dictId": 1,
            "dictName": "立项",
            "dictType": 0,
            "isEdit": 0
        },
        {
            "children": [
                {
                    "dictId": 200,
                    "dictName": "方案",
                    "dictType": 1,
                    "isEdit": 0,
                    "parentId": 2
                }
            ],
            "dictId": 2,
            "dictName": "设计",
            "dictType": 0,
            "isEdit": 1
        },
        {
            "children": [
                {
                    "dictId": 300,
                    "dictName": "预算编制",
                    "dictType": 1,
                    "isEdit": 0,
                    "parentId": 3
                },
                {
                    "dictId": 301,
                    "dictName": "预算审核",
                    "dictType": 1,
                    "isEdit": 1,
                    "parentId": 3
                }
            ],
            "dictId": 3,
            "dictName": "造价",
            "dictType": 0,
            "isEdit": 1
        },
        {
            "children": [
                {
                    "dictId": 400,
                    "dictName": "选聘",
                    "dictType": 1,
                    "isEdit": 0,
                    "parentId": 4
                }
            ],
            "dictId": 4,
            "dictName": "选聘",
            "dictType": 0,
            "isEdit": 1
        },
        {
            "children": [
                {
                    "dictId": 500,
                    "dictName": "合同签订",
                    "dictType": 1,
                    "isEdit": 1,
                    "parentId": 5
                },
                {
                    "dictId": 501,
                    "dictName": "实施",
                    "dictType": 1,
                    "isEdit": 1,
                    "parentId": 5
                }
            ],
            "dictId": 5,
            "dictName": "实施",
            "dictType": 0,
            "isEdit": 1
        },
        {
            "children": [
                {
                    "dictId": 600,
                    "dictName": "验收",
                    "dictType": 1,
                    "isEdit": 0,
                    "parentId": 6
                }
            ],
            "dictId": 6,
            "dictName": "验收",
            "dictType": 0,
            "isEdit": 1
        },
        {
            "children": [
                {
                    "dictId": 700,
                    "dictName": "结算",
                    "dictType": 1,
                    "isEdit": 0,
                    "parentId": 7
                },
                {
                    "dictId": 701,
                    "dictName": "决算",
                    "dictType": 1,
                    "isEdit": 1,
                    "parentId": 7
                }
            ],
            "dictId": 7,
            "dictName": "结/决算",
            "dictType": 0,
            "isEdit": 1
        },
        {
            "children": [
                {
                    "dictId": 900,
                    "dictName": "质保",
                    "dictType": 1,
                    "isEdit": 0,
                    "parentId": 8
                }
            ],
            "dictId": 8,
            "dictName": "质保",
            "dictType": 0,
            "isEdit": 1
        }
    ],
    "errorCode": 0,
    "msg": "success",
    "state": 0
}

实体类和表结构如下:

@Data
public class ScheduleProcessDict {
    
    @Id
    private Integer dictId;
    private String dictName;
    private Byte dictType;
    // 父级id
    private Integer parentId;
    private Byte isEdit;
    @Transient
    private List<ScheduleProcessDict> children;
    public ScheduleProcessDict() {
        this.children = new ArrayList<>();
    }
    public void addChild(ScheduleProcessDict processDict) {
        this.children.add(processDict);
    }

}

主要的接口返回实现类

	@Override
    public List<ScheduleProcessDict> getAllStageDict() {
        List<ScheduleProcessDict> processDictList = processDictMapper.select(null);

        // 处理数据
        Map<Integer, ScheduleProcessDict> processDictMap = new HashMap<>();
        // 遍历存,dictId为key,对象为value
        for (ScheduleProcessDict processDict : processDictList) {
            processDictMap.put(processDict.getDictId(), processDict);
        }
        // 遍历取数据,
        for (ScheduleProcessDict processDict : processDictList) {
            Integer parentId = processDict.getParentId();
            if (parentId != null) {
                ScheduleProcessDict dict = processDictMap.get(parentId);
                if (dict != null) {
                    dict.addChild(processDict);
                }
            }
        }

        // 过滤没用父节点的数据项
        List<ScheduleProcessDict> result = new ArrayList<>();
        for (ScheduleProcessDict scheduleDict : processDictList) {

            // 如果一个数据项没有子节点,则将它的 children 属性设为 null
            if (scheduleDict.getChildren().size() == 0) {
                scheduleDict.setChildren(null);
            }
            if (scheduleDict.getParentId() == null) {
                result.add(scheduleDict);
            }
        }
        return result;

返回结果如上.

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值