java递归查询节点数据(级联选择器数据)

java递归查询节点数据(级联选择器数据)
方法一(java递归)
    @Resource
    private CourseCategoryMapper courseCategoryMapper;
/**
 * 根据父节点id查询子节点数据
 *
 * @return 子节点数据
 */
@Override
public List<CourseCategoryTreeDto> queryTreeNodesById2(String id) {
    //查询所有
    List<CourseCategory> courseCategoryList = courseCategoryMapper.selectList(null);
    //将数据转dto
    List<CourseCategoryTreeDto> collect = courseCategoryList.stream().map(item -> {
        //创建dto对象封装数据
        CourseCategoryTreeDto courseCategoryTreeDto = new CourseCategoryTreeDto();
        //拷贝数据
        BeanUtils.copyProperties(item, courseCategoryTreeDto);
        return courseCategoryTreeDto;
    }).collect(Collectors.toList());
    //创建节点作为父节点
    CourseCategoryTreeDto courseCategoryTreeDto = new CourseCategoryTreeDto();
    courseCategoryTreeDto.setId(id);
    //调用方法递归封装数据并返回子节点数据
    return selectRecursionTreeNode(courseCategoryTreeDto, collect).getChildrenTreeNodes();
}

/**
 * 递归查询当前节点及子节点数据
 *
 * @param courseCategoryTreeDto 节点
 * @param allList               全部数据
 * @return 当前节点及子节点数据
 */
private CourseCategoryTreeDto selectRecursionTreeNode(CourseCategoryTreeDto courseCategoryTreeDto, List<CourseCategoryTreeDto> allList) {
    //遍历所有数据找出子节点
    for (CourseCategoryTreeDto item : allList) {
        //找出当前节点子节点
        if (item.getParentid().equals(courseCategoryTreeDto.getId())) {
            //初始化,避免NullPointerException
            if (courseCategoryTreeDto.getChildrenTreeNodes() == null) {
                courseCategoryTreeDto.setChildrenTreeNodes(new ArrayList<>());
            }
            //将此节点及其子节点数据加入父节点
            courseCategoryTreeDto.getChildrenTreeNodes().add(selectRecursionTreeNode(item, allList));
        }
    }
    //返回将此节点及其子节点数据加入父节点
    return courseCategoryTreeDto;
}
方法二(数据库递归)

Mapper

List<CourseCategoryTreeDto> queryTreeNodes(String id);

XML

<select id="queryTreeNodes" parameterType="string" resultType="com.xuecheng.content.model.dto.CourseCategoryTreeDto">
    with recursive t1 as (
        select course_category.* from course_category where id=#{id}
        union all
        select course_category.* from course_category inner join t1 on t1.id=course_category.parentid
    )
    select * from t1 order by id;
</select>

Service

    @Resource
    private CourseCategoryMapper courseCategoryMapper;

    @Override
    public List<CourseCategoryTreeDto> queryTreeNodesById(String id) {
        List<CourseCategoryTreeDto> list = courseCategoryMapper.queryTreeNodes(id);

        Map<String, CourseCategoryTreeDto> dtoMap = list.stream().filter(item -> !Objects.equals(item.getId(), id)).collect(Collectors.toMap(CourseCategory::getId, value -> value));
        //创建最终封装数据对象
        ArrayList<CourseCategoryTreeDto> courseCategoryTree = new ArrayList<>();

        list.stream().filter(item -> !Objects.equals(item.getId(), id)).forEach(item -> {
            //找出一级节点对象
            if (item.getParentid().equals(id)) {
                courseCategoryTree.add(item);
            }
            //找出当前节点父节点对象
            CourseCategoryTreeDto courseCategoryTreeDto = dtoMap.get(item.getParentid());
            if (courseCategoryTreeDto != null) {
                //有父节点,判断子节点是否为空
                if (courseCategoryTreeDto.getChildrenTreeNodes() == null) {
                    courseCategoryTreeDto.setChildrenTreeNodes(new ArrayList<>());
                }
                //将当前节点加入父节点
             }

        });

        return courseCategoryTree;

    }
方法三(Stream流)
 public List<Category> listMemuTree() {
        //查询所有
        List<Category> categoryAll = this.list();
       return categoryAll.stream()
               //找出所有一级分类
                .filter(category -> category.getParentCid() == 0)
               //设置一级分类子节点
                .map(category -> {
                    List<Category> children = getChildren(category, categoryAll);
                    category.setChildren(children.size() > 0 ? children : null);
                    return category;
                })
               //排序
                .sorted(Comparator.comparingInt(e -> (e.getSort() == null ? 0 : e.getSort())))
                .collect(Collectors.toList());

    }

    /**
     * 查询当前节点子节点
     * @param category 当前结点
     * @param all 所有结点
     * @return
     */
    private List<Category> getChildren(Category category, List<Category> all) {
        return all.stream()
                .filter(item -> Objects.equals(item.getParentCid(), category.getCatId()))
                .map(item -> {
                    List<Category> children = getChildren(item, all);
                    item.setChildren(children.size() > 0 ? children : null);
                    return item;
                }).sorted(Comparator.comparingInt(e -> (e.getSort() == null ? 0 : e.getSort())))
                .collect(Collectors.toList());
    }
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
(5)\\python全栈day41-50\\python全栈s3 day41;目录中文件数:10个 ├─(1) 01 python s3 day41 JS的历史以及引入方式.avi ├─(2) 02 python s3 day41 JS的基础规范.avi ├─(3) 03 python s3 day41 JS的基本数据类型.avi ├─(4) 04 python s3 day41 JS的运算符.avi ├─(5) 05 python s3 day41 JS的控制语句与循环.avi ├─(6) 06 python s3 day41 JS的循环与异常.avi ├─(7) 07 python s3 day41 JS的字符串对象.avi ├─(8) 08 python s3 day41 JS的数组对象.avi ├─(9) 09 python s3 day41 JS的函数对象.avi ├─(10) day41.rar (6)\\python全栈day41-50\\python全栈s3 day42;目录中文件数:6个 ├─(11) 01 python s3 day42 JS的函数作用域.avi ├─(12) 02 python s3 day42 JS的window对象之定时器.avi ├─(13) 03 python s3 day42 JS的history对象和location对象.avi ├─(14) 04 python s3 day42 JS的DOM节点.avi ├─(15) 05 python s3 day42 JS的DOM节点.avi ├─(16) day42.rar (7)\\python全栈day41-50\\python全栈s3 day43;目录中文件数:10个 ├─(17) 01 python s3 day43 上节知识回顾.avi ├─(18) 02 python s3 day43 js之onsubmit事件与组织事件外延.avi ├─(19) 03 python s3 day43 DOM节点的增删改查与属性设值.avi ├─(20) 04 python s3 day43 正反选练习.avi ├─(21) 05 python s3 day43 js练习之二级联动.avi ├─(22) 06 python s3 day43 jquery以及jquery对象介绍.avi ├─(23) 07 python s3 day43 jquery选择器.avi ├─(24) 08 python s3 day43 jquery的查找筛选器.avi ├─(25) 09 python s3 day43 jquery练习之左侧菜单.avi ├─(26) day43课件代码.rar (8)\\python全栈day41-50\\python全栈s3 day44;目录中文件数:10个 ├─(27) 01 python s3 day44 jquery属性操作之html,text,val方法.avi ├─(28) 02 python s3 day44 jquery循环方法和attr,prop方法.avi ├─(29) 03 python s3 day44 jquery模态对话框与clone的应用.avi ├─(30) 04 python s3 day44 jqueryCSS操作之offsets,position以及scrolltop.avi ├─(31) 05 python s3 day44 jquery事件绑定与事件委托.avi ├─(32) 06 python s3 day44 jquery动画效果.avi ├─(33) 07 python s3 day44 jquery扩展与插件.avi ├─(34) 08 python s3 day44 jquery扩展补充.avi ├─(35) 09 python s3 day44 本周作业轮播图以及思路.avi ├─(36) day44课件代码.rar (9)\\python全栈day41-50\\python全栈s3 day45;目录中文件数:3个 ├─(37) day45.rar ├─(38) 轮播图片css部分.avi ├─(39) 轮播图片js部分.avi (10)\\python全栈day41-50\\python全栈s3 day46;目录中文件数:8个 ├─(40) 01 python s3 day46 数据库与dbms的概念.avi ├─(41) 02 python s3 day46 sql规范.avi ├─(42) 03 python s3 day46 数据库操作DDL.avi ├─(43) 04 python s3 day46 mysql的数据类型.a
/** * 根据等级查询类目树 * * @param level * @return */ @Override public List queryCategoryTree(Integer level) { //查询当前级别下类目 List list = categoryDAO.list(level); //组装好的类目树,返回前端 List categoryTree = new ArrayList(); //所有类目 List allDTOList = new ArrayList(); if (CollectionUtils.isEmpty(list)) { return categoryTree; } for (CategoryDO categoryDO : list) { allDTOList.add(new CategoryTreeDTO().convertDOToDTO(categoryDO)); } //当前等级类目 categoryTree = allDTOList.stream().filter(dto -> level.equals(dto.getLevel())).collect(Collectors.toList()); for (CategoryTreeDTO categoryTreeDTO : categoryTree) { //组装类目为树结构 assembleTree(categoryTreeDTO, allDTOList,Constants.CATEGORY_MAX_LEVEL - level); } return categoryTree; } /** * 组装树 * * @param categoryTreeDTO * @param allList * @param remainRecursionCount 剩余递归次数 * @return */ public CategoryTreeDTO assembleTree(CategoryTreeDTO categoryTreeDTO, List allList, int remainRecursionCount) { remainRecursionCount--; //最大递归次数不超过Constants.CATEGORY_MAX_LEVEL-level次,防止坏数据死循环 if(remainRecursionCount < 0){ return categoryTreeDTO; } String categoryCode = categoryTreeDTO.getCategoryCode(); Integer level = categoryTreeDTO.getLevel(); //到达最后等级树返回 if (Constants.CATEGORY_MAX_LEVEL == level) { return categoryTreeDTO; } //子类目 List child = allList.stream().filter(a -> categoryCode.equals(a.getParentCode())).collect(Collectors.toList()); if (null == child) { return categoryTreeDTO; } categoryTreeDTO.setChildren(child); //组装子类目 for (CategoryTreeDTO dto : child) { assembleTree(dto, allList,remainRecursionCount); } return categoryTreeDTO; }
element-ui 中的 Cascader 级联选择器需要一个级联数据源,这个数据源可以是一个普通的数组或者是一个包含子节点的树形结构。如果数据源是一个普通的数组,需要通过递归处理将其转化为树形结构。 以下是一个示例代码,将普通的数组转化为树形结构: ```js function convertToTree(data) { let result = [] let map = {} // 先将所有数据按照 id 存入一个 map 中 for (let i = 0; i < data.length; i++) { map[data[i].id] = data[i] } // 将所有数据遍历一遍,如果当前数据有 parentId,将其作为父节点子节点存入父节点的 children 中 for (let i = 0; i < data.length; i++) { let item = data[i] if (item.parentId) { let parent = map[item.parentId] if (parent) { if (!parent.children) { parent.children = [] } parent.children.push(item) } } else { result.push(item) } } return result } ``` 在上述代码中,首先将所有数据按照 id 存入一个 map 中,然后遍历所有数据,如果当前数据有 parentId,就将其作为父节点子节点存入父节点的 children 中,最后返回处理后的树形结构。 使用示例: ```js let data = [ { id: 1, name: '选项1' }, { id: 2, parentId: 1, name: '选项1-1' }, { id: 3, parentId: 1, name: '选项1-2' }, { id: 4, name: '选项2' }, { id: 5, parentId: 4, name: '选项2-1' }, { id: 6, parentId: 4, name: '选项2-2' } ] let treeData = convertToTree(data) console.log(treeData) ``` 输出结果: ```js [ { "id": 1, "name": "选项1", "children": [ { "id": 2, "parentId": 1, "name": "选项1-1" }, { "id": 3, "parentId": 1, "name": "选项1-2" } ] }, { "id": 4, "name": "选项2", "children": [ { "id": 5, "parentId": 4, "name": "选项2-1" }, { "id": 6, "parentId": 4, "name": "选项2-2" } ] } ] ``` 将转换后的数据源作为 Cascader 的 options 属性即可完成级联选择器数据递归处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值