//加載符合條件的節點
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{
//頂級節點中單獨處理
}
}*/
}