js递归

# 背景

由于需要实现过滤zTree的node过滤,所以用js实现一遍。

后来发现,ztree的扩展包中提供了hideNode(node)方法,这个就简单了。不用自己写js迭代那么麻烦。

# 基本要求

1输入数据:

id=1

var zNodes = [
    {id: 1, pId: 0, name: "父节点1 - 展开",},
    {id: 11, pId: 1, name: "父节点11 - 折叠"},
    {id: 111, pId: 11, name: "叶子节点111"},
    {id: 2, pId: 0, name: "父节点12 - 折叠"},
    {id: 21, pId: 2, name: "叶子节点121"},
    {id: 222, pId: 21, name: "叶子节点122"}
];

2输出数据:

var zNodes = [
    {id: 1, pId: 0, name: "父节点1 - 展开",},
    {id: 11, pId: 1, name: "父节点11 - 折叠"},
    {id: 111, pId: 11, name: "叶子节点111"}
];

即:根据输入的id,nodes集合,获取该id的所有子孙node的集合allChildrenNodes

 

3插件使用的zTree

 

# 实现

        var setting = {
            data: {
                simpleData: {
                    enable: true
                }
            }
        };

        var zNodes = [
            {id: 1, pId: 0, name: "父节点1 - 展开",},
            {id: 11, pId: 1, name: "父节点11 - 折叠"},
            {id: 111, pId: 11, name: "叶子节点111"},
            {id: 12, pId: 1, name: "父节点12 - 折叠"},
            {id: 121, pId: 12, name: "叶子节点121"},
            {id: 122, pId: 12, name: "叶子节点122"},
            {id: 2, pId: 0, name: "叶子节点122"},
            {id: 3, pId: 0, name: "叶子节点122"}
        ];
       

        function mgetChildren(id, zNodes) {
            var children = new Array();
            for (var i = 0; i < zNodes.length; i++) {
                var node = zNodes[i];
                if (node.pId == id) {
                    children.push(node);
                }
            }

            var total_childChildrens = new Array();
            if (children.length > 0) {
                for (var i = 0; i < children.length; i++) {
                    var childChildrens = mgetChildren(children[i].id, zNodes);

					total_childChildrens = total_childChildrens.concat(childChildrens);

                }
            }

			children = children.concat(total_childChildrens);
            console.log(children);
            return children;
        }

        console.log(zNodes);
        var cNodes = mgetChildren(1, zNodes);
        console.log(cNodes);
        debugger
        $(document).ready(function () {
            $.fn.zTree.init($("#treeDemo"), setting, cNodes);
        });

# 逻辑ok,但是递归调用的不返回数据,诡异 ,先不管吧,明天再看看是什么原因--------------------------------------

 

最后终于搞定了,原因是js的数组合并,不能改变原有的数组,以结果的形式返回一个新的数组

 

============================================================================

为了证明我的逻辑没有错误,用java实现了一遍,非常完美,一次就过了。。。。。

贴代码:

package com.nuomi.permission.web.pc;

import java.util.ArrayList;
import java.util.List;

/**
 * 用递归实现过滤Node,获取所有的子孙节点
 * @author yanwei.hu@outlook.com
 * @Date: 2019/8/12 23:59
 */
public class digvTest {
    public static void main(String[] args) {
        String did = "1";
        List<Node> list = new ArrayList<>();
        list.add(new Node("1", "0", "父节点1"));
        list.add(new Node("11", "1", "父节点11"));
        list.add(new Node("111", "11", "父节点111"));
        list.add(new Node("2", "0", "父节点1"));
        List<Node> allC = getC(did, list);
        System.out.println(allC);
    }

    private static List<Node> getC(String pId, List<Node> list) {
        //all children
        List<Node> clist = new ArrayList<>();
        for (Node node : list) {
            if (node.getpId().equals(pId)) {
                clist.add(node);
            }
        }

        //check children has children
        List<Node> sub_clist = new ArrayList<>();
        if (clist.size() > 0) {
            for (Node node : clist) {
                String cId = node.getId();
                List<Node> cc = getC(cId, list);
                sub_clist.addAll(cc);
            }
        }

        clist.addAll(sub_clist);

        return clist;
    }


}

class Node {
    String id;
    String pId;
    String name;

    @Override
    public String toString() {
        return "Node{" +
                "id='" + id + '\'' +
                ", pId='" + pId + '\'' +
                ", name='" + name + '\'' +
                '}';
    }

    public Node(String id, String pId, String name) {
        this.id = id;
        this.pId = pId;
        this.name = name;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getpId() {
        return pId;
    }

    public void setpId(String pId) {
        this.pId = pId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

============================================================================

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值