//加载符合条件的节点
function filterForMouseover(name){
var allData = $("#reviewTable").treegrid('getData');//获取树结构的顶级节点集合
if(allData){
if(name == '合格'){
beforeFilter(allData,1);
}else if(name == '不合格未扣分'){
beforeFilter(allData,2);
}else if(name == '不合格扣分'){
beforeFilter(allData,3);
}else{
//加载全部
var loadData = {};
loadData.data = allData.rows;
$('#reviewTable').treegrid('loadData',loadData);
}
}
}
function beforeFilter(allData,status){
//拷贝对象(不能直接使用allData ,这样会改变allData )
var allDataCopy = JSON.parse(JSON.stringify(allData));
var rows = allDataCopy.rows ;
for(var k = rows.length - 1 ; k >= 0; k-- ){
var root = rows[k];
//子节点是否满足条件,在递归中进行判断
filterDataByStatus(root,status,k,null,rows);
var children = root.children;//顶级节点的是否满足条件,由下面进行判断
if(children.length == 0 && root.mystate != status){
rows.splice(k,1);
}
}
var loadData = {};
loadData.data = rows;
$('#reviewTable').treegrid('loadData',loadData);
}
/**
* 把节点中不符合规则的机率过滤,但是如果子节点符合条件,父节点不符合,父节点也要显示出来,要保留树结构
* 需要注意的是:子节点都会被递归,如果子节点的chldren为0,并且不符合条件,那么在递归子节点之后,会被父节点删除
* if(child.children.length > 0 ){
//处理子节点数据
filterDataByStatus(child,status,i,row,rows);
}
//如果子节点没有子节点了,并且子节点不符合要求,则父节点将子节点删除
if(child.children.length == 0 && child.mystate != status){
row.children.splice(i,1);
}
* 所以子节点的删除由其父节点控制,只有顶级节点需要额外判断
* @param row 当前树节点
* @param status 需要过滤的数值
* @param myIndex status 等于myIndex的节点才需要保留
* @param parent row的父节点,如果parent为null,则row为顶级节点,其父节点为rows
* @param rows 顶级节点的集合
* @returns
*/
function filterDataByStatus(row,status,myIndex,parent,rows){
var children = row.children;
if(children.length > 0 ){
for(var i = children.length -1 ; i >= 0 ; i--){
var child = children[i];
if(child.children.length > 0 ){
//处理子节点数据
filterDataByStatus(child,status,i,row,rows);
}
//如果子节点没有子节点了,并且子节点不符合要求,则父节点将子节点删除
if(child.children.length == 0 && child.mystate != status){
row.children.splice(i,1);
}
}
//这里不能这么写,会删除parent.children中保留的正确的节点,因为子节点已经在循环里面由父节点删除了(row.children.splice(i,1);),当前这个row如果有父节点,那么会在父节点的for(var i = children.length -1 ; i >= 0 ; i--){..}
//执行row.children.splice(i,1)删除的.这里再执行删除,那么就是从parent.children中再删除下标为myIndex的节点,myIndex这个节点已经不是当前的row节点了,而是row节点的下一个节点(所以只要判断如果节点有父节点,那么会被父节点递归子节点删除)
//如果是顶级节点,才要额外判断
/*if(children.length == 0 && child.mystate != status){
parent.children.splice(myIndex,1);
}*/
}/*else{ //这个也是不需要的,不符合要求的子节点会由父节点循环子节点的时候删除,顶级节点循环中也单独做了判断
if(parent){
parent.children.splice(myIndex,1);
}else{
//顶级节点中单独处理
}
}*/
}