# 背景
由于需要实现过滤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;
}
}
============================================================================