一 . 叶子对象和非叶子对象
在项目开发中,老蝴蝶常常遇见这样的问题, 对于一个自身关联的表数据,如权限数据,可参照上一章的数据内容,为了方便,这儿直接拿过来。
如一个权限表:
后端返回给前端的数据格式是,
用的是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; }
谢谢!!!