ztree 筛选选中节点,算法问题

那页阳光

项目需求

最近整理公司后台,需要用到ztree做一个无限极分类的树节点。选中规则如下:

- 父节点下面的子节点全部选中。则只需要父节点
- 父节点下面的子节点没有被全选,则需要被选中的子节点

无限极分类啊,哥哥们。不是省市区三级分类,大不了多堆几个循环。还得考虑祖节点和子节点的关系。

解决方案

面对这种需求第一反应就是递归,获取所有被选中节点。筛选出level=0的节点。递归遍历判断子节点是否选中,全选,则把父节点筛选出来。不全选,则把选中的子节点筛选出来。

挂在懵逼树上一天....毫无头绪...

那就换个思路解决:

/**
 * 添加类目词操作
 * 1. 如果节点是父节点并且子节点全部选中则写入数组
 * 2. 如果节点是子节点并且节点的父节点不存在数组,则写入数组
 * 3. 过滤数组中的父节点,移除低阶的父节点
 * 4. ztree返回选中数据,按选中顺序返回,不需要进行排序
 * 5. 别鸡儿用什么递归....
 * @param event
 * @param treeId
 * @param treeNode
 */
, actionCheck: function (event, treeId, treeNode) {
    let treeObj = $.fn.zTree.getZTreeObj(treeId);
    let nodes = treeObj.getCheckedNodes(true);
    let checkNode = [];
    $.each(nodes, function (key, item) {
        if (item.isParent) {
            if (!item.getCheckStatus().half)
                checkNode.push(item);
        } else {
            if (checkNode.findIndex(function (val) {return val.id === item.parent}) === -1)
                checkNode.push(item);
        }
    });
    checkNode.forEach(function (item) {
        checkNode = checkNode.filter(val => val.parent !== item.id);
    });
    console.log(checkNode);
}

大功告成!!!

效果图

123.png

各位大神要是有什么递归的解决方案,不吝赐教啊,把我从懵逼树上放下来。感激不尽

阅读 1.6k

低调的很闷骚,沉默的很高傲。

295 声望
16 粉丝
0 条评论

低调的很闷骚,沉默的很高傲。

295 声望
16 粉丝
文章目录
宣传栏