在开发中,经常会遇到返回树形结果的数据,那么下面这个例子就是较好的学习案例.
返回以下形式的树形结构返回结果:
{
"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;
返回结果如上.