今日,java程序中碰到菜单权限枚举(Enum),把一组权限转换为树形,返回给前端VUE展现。4个系统的4个菜单权限枚举中,重复的出现列表转换为树形的代码。显然代码重复了,需要优化。平时,java类中重复代码,抽取放到父类。枚举已继承Enum,所以不能继承其他类。想到把列表转换树形的实现,放到前端。前端把这段代码,多个系统间共享一个转化方法。后台则减少大量重复代码。(ps:菜单权限枚举会增加,枚举会达到几十个左右)。
详细代码用例
//array数组转换为array树形,把叶子节点放到父节点中。parentCode是父节点code.根节点code=0;element为父节点元素 function coverToTree(array,parentCode,element){ for(var i=0;i<array.length;i++){ //一级节点 if(array[i].parentCode == 0){ if( array[i].tag ==1){continue;} array[i].tag=1; coverToTree(array,array[i].code,array[i]); }else if(array[i].parentCode == parentCode ){//非一级节点 if(element.childs == undefined ){ element.childs = new Array(); } var tmp = array[i]; element.childs.push(tmp); array.splice(i--,1); coverToTree(array,tmp.code,tmp); } } return array; } //测试用例 var a = [{"code":1,"parentCode":0},{"code":2,"parentCode":0},{"code":3,"parentCode":1},{"code":4,"parentCode":2},{"code":5,"parentCode":3}]; a = coverToTree(a,0); document.write(toString(a)); //js对象转换为json字符串.json字符串不能出现空格,否则不规范。 function toString(jsonObj){ if(jsonObj instanceof Array){ var jStr = "["; for(var i=0;i<jsonObj.length;i++){ var t = jsonObj[i]; jStr +=toString(t); if(jsonObj.length-1!=i){ jStr+=","; } } jStr += "]"; return jStr.replace(/\s+/g,''); }else{ var jStr = "{"; for(var item in jsonObj){ var myObj = jsonObj[item]; if(myObj instanceof Array){ jStr += "\""+item+"\":"+toString(myObj)+","; }else{ jStr += "\""+item+"\":\""+jsonObj[item]+"\","; } } jStr= jStr.slice(0,-1) + "}"; return jStr.replace(/\s+/g,''); } }
运行结果:
[{
"code": "1",
"parentCode": "0",
"tag": "1",
"childs": [{
"code": "3",
"parentCode": "1",
"childs": [{
"code": "5",
"parentCode": "3"
}]
}]
}, {
"code": "2",
"parentCode": "0",
"tag": "1",
"childs": [{
"code": "4",
"parentCode": "2"
}]
}]
总结:json序列化,没有使用工具方法,自己实现json规范,学到了知识的细节。例如不能有空格,必须使用双引号等。