1、前言
项目中可能会根据前端框架的需要返回比较复杂的的数据结构,今天刚好碰到了这种问题,顺便记录一下我的方法,仅供参考,如果有什么不对的地方或者可以优化的地方还请大家批评指正。
2.实战演练
- 假如前端需要返回以下结构的数据
[
{
id: 1,
label: 'Level one 1',
children: [{
id: 4,
label: 'Level two 1-1'
}]
},
{
id: 2,
label: 'Level one 2',
children: [{
id: 5,
label: 'Level two 2-1'
}, {
id: 6,
label: 'Level two 2-2'
}]
},
{
id: 3,
label: 'Level one 3',
children: [{
id: 7,
label: 'Level two 3-1'
},
{
id: 8,
label: 'Level two 3-2'
}]
}
]
- 分析返回数据,总结规律(我已总结好)
- step1: 根据返回的数据创建对应的实体类,上面的数据就需要创建两个实体类,因为返回数据是一个两层的结构。
//一级分类
@Data
public class OneSubject {
private String id;
private String title;
//一个一级分类可能包含多个二级分类
private List<TwoSubject> children = new ArrayList<>();
}
//二级分类
@Data
public class TwoSubject {
private String id;
private String title;
}
- step2:在两个实体类之中表示这两个类之间的关系,由上面的数据数据结构可以看出,一个以及分类中可以包含多个二级分类
- step3:从数据库中分别拿到一级分类的全部数据,以及二级分类的全部数据
//查询出所有的一级分类
List<EduSubject> oneSubjectList = baseMapper.selectList(new QueryWrapper<EduSubject>().eq("parent_id","0"));
//查询出所有的二级分类
List<EduSubject> twoSubjectList = baseMapper.selectList(new QueryWrapper<EduSubject>().ne("parent_id","0"));
- step4:在所有的一级分类对象中添加对应的二级分类集合
List<OneSubject> finalSubject = new ArrayList<>();
//封装一级分类
for(EduSubject oneSubject : oneSubjectList){
OneSubject tempSubject = new OneSubject();
BeanUtils.copyProperties(oneSubject,tempSubject);
finalSubject.add(tempSubject);
}
//封装二级分类
for(OneSubject oneSubject : finalSubject){
List<TwoSubject> twoSubjects = new ArrayList<>();
for(EduSubject eduSubject : twoSubjectList){
if(eduSubject.getParentId().equals(oneSubject.getId())){
TwoSubject twoSubject = new TwoSubject();
twoSubject.setId(eduSubject.getId());
twoSubject.setTitle(eduSubject.getTitle());
twoSubjects.add(twoSubject);
}
}
oneSubject.setChildren(twoSubjects);
}
step5:返回数据。