var result = { "Tables":{ "B2B_DS_ORDERMX0":{ "ordernum":"tables-0[0] 未定,int,10", }, "B2B_DS_ORDERHZ1":{ "ordernum":"tables-1[0] 未定,int,10", "hasChild":{"type":"tables-1[1]","value":"12"} } }, "Json":{ "_id" : "Json-0[0]订单ID,objectid,32", "goodsList" : { "goodsId" : "Json-1[0]未定,int,10" } } }
以上result为一段json格式代码,要求:分别输出Tables和Json,若Tables和Json有子集,则要包含字段"expanded":true,"children":[子集],一直循环到无子集则包含字段"leaf":true,一开始无子集,则直接"leaf":true
思路分析:
for/in 语句循环遍历对象的属性。
js中获取key得到某对象中相对应的value的方法:obj.key
js中根据动态key得到某对象中相对应的value
对象的属性值存在子集,若为数组/对象,则typeof == "object",若不存在子集,则为字符串typeof == "string",所以只要通过循环判断对象属性值的类型,即可知道是否存在子集
解决方法:
1 function makearr(jsonarr){ 2 let arr = []; 3 4 for(let i in jsonarr){ 5 // console.log(jsonarr[i]); 6 7 if(typeof jsonarr[i] == "object"){ 8 var ret = { 9 "text":i, 10 "expanded":true, 11 "field":i 12 }; 13 ret.children = makearr(jsonarr[i]); 14 15 }else{ 16 let _arr = jsonarr[i].split(","); 17 var ret = { 18 "text":i, 19 "leaf":true, 20 "field":i 21 }; 22 } 23 arr.push(ret); 24 } 25 26 return arr; 27 } 28 29 30 var _arr1 = makearr(result.Tables); 31 console.log(_arr1); 32 var _arr2 = makearr(result.Json); 33 console.log(_arr2);
输出结果: