古语有云: 万恶淫为首,百善孝为先。 我们后辈当自勉。
上一章简单介绍了JS对象数组的递归排序(二十四),如果没有看过,请观看上一章。
一 . 叶子对象和非叶子对象
在项目开发中,老蝴蝶常常遇见这样的问题, 对于一个自身关联的表数据,如权限数据,可参照上一章的数据内容,为了方便,这儿直接拿过来。
如一个权限表:
后端返回给前端的数据格式是,
用的是bootstrap-table 展示 。
常常要分开叶子对象和非叶子对象。 叶子对象,就是没有子节点的数据,如 ‘部门添加功能’ 这个节点。 非叶子对象,就是指有子节点的数据,如 ‘部门管理’ 权限, 有 添加,修改,删除三个子节点。 在展示的时候,要分别展示出不同的效果,非叶子对象展示成什么样式的,叶子对象展示成什么样式的。 如导航时, 导航只显示有叶子节点的。
数据响应,响应结果与上一章一样。
二. 两个判断叶子对象和非叶子对象的方法
先遍历一下,所有的父节点。 把所有的父节点 Id放置在一个集合里面。 再遍历一下data 数据,如果id 在父级里面,那么说明有子级,非叶子对象,如果不在父级里面,说明没有子级,为叶子对象。
/**
* 所有非叶子节点的对象,有下一级的对象。
* @param data 数据
* @param idName id名称
* @param pIdName 父级的名称
*/
function listToHaveSon(data,idName,pIdName){
var newData=[];
var parentIdList=new Array();
$.each(data,function(idx,item){
//把所有的父节点放置进来。
if(item[pIdName]){ //有值,就放置进来。
parentIdList.push(item[pIdName]);
}
})
$.each(data,function(idx,item){
if(parentIdList.indexOf(item[idName])!=-1){ //有当前的
newData.push(item);
}
})
return newData;
}
/**
* 所有叶子节点的对象,即没有下一级的对象。
* @param data 数据
* @param idName id名称
* @param pIdName 父级的名称
*/
function listToNoHaveSon(data,idName,pIdName){
var newData=[];
var parentIdList=new Array();
$.each(data,function(idx,item){
//把所有的父节点放置进来。
if(item[pIdName]){ //有值,就放置进来。
parentIdList.push(item[pIdName]);
}
})
$.each(data,function(idx,item){
if(parentIdList.indexOf(item[idName])==-1){ //没有当前的。
newData.push(item);
}
})
return newData;
}
三. 验证输出
bootstrap-table 响应。
function handleClientData(res){
var privilegeList=res.privilegeList?res.privilegeList:[];
var resultData=listToTree(privilegeList,"id","parentid");
var haveSonData=listToHaveSon(privilegeList,"id","parentid");
console.log("有子节点的:"+JSON.stringify(haveSonData));
var haveNoSonData=listToNoHaveSon(privilegeList,"id","parentid");
console.log("没有节点的:"+JSON.stringify(haveNoSonData));
return resultData;
}
谢谢!!!