拼接字符串,生成tree格式的JSON数组

之前做的执法文书的工作,现在需要从C#版本移植到网页版,从Thrift接口获取数据,加载到对应的控件中

之前用的easyui的Tree插件,通过<ul><li><span></span></li></ul>标签的方式生成node树,条理清晰,虽然麻烦点,但是用循环写几行代码就能搞定,但是,在Ajax的函数里面,tree的样式加载不上,显示的格式就是元素自带的含义,<ul>和<li>,无法点击,下面的工作也就无法完成,我将生成tree的函数移出Ajax,样式就能加载上了,调试了两天毫无进展,心一横,换一个Node插件

首先推荐一个JQuery的库-- JQuery插件库,我在这个插件库里找到一个根据BootStrap开发的树节点

 

调试了一下,生成了一个我需要的Demo(提示一下,想要生成Tree效果,还需要加载bootstrap的css),代码如下:

 1 <%@ page contentType="text/html;charset=UTF-8" language="java" %>
 2 <html>
 3 <head>
 4 <title>测试页面</title>
 5     <link rel="stylesheet" type="text/css" href="lib/css/bootstrap-treeview.css">
 6     <link rel="stylesheet" type="text/css" href="lib/css/bootstrap.css">
 7 </head>
 8 <body>
 9 <div id="tree"></div>
10 <script type="text/javascript" src="lib/js/jquery-3.2.1.js"></script>
11 <script type="text/javascript" src="lib/js/bootstrap-treeview.js"></script>
12 
13 <script type="text/javascript">
14 
15     var rootNode= new Array();
16 
17     $(function() {
18         var defaultData = [
19             {
20                 id : "211201",
21                 text: '洪泽湖',
22                 tags: ['洪泽湖'],
23                 nodes: [
24                     {
25                         text: '东咀站',
26                         href: '#child1',
27                         tags: ['2'],
28                         nodes: [
29                             {
30                                 text: '光电',
31                                 href: '#grandchild1',
32                                 tags: ['0'],
33                                 nodes: [
34                                     {
35                                         text: '设备还不错',
36                                         href: '#child1',
37                                         tags: ['2']
38                                     }]
39                             },
40                             {
41                                 text: '雷达',
42                                 href: '#grandchild2',
43                                 tags: ['0']
44                             }
45                         ]
46                     },
47                     {
48                         text: '胡庄站',
49                         href: '#child2',
50                         tags: ['0'],
51 
52                     }
53                 ]
54             },
55             {
56                 text: '太湖',
57                 href: '#parent2',
58                 tags: ['0']
59             },
60             {
61                 text: '鄱阳湖',
62                 href: '#parent3',
63                 tags: ['0']
64             }
65         ];
66 
67         $('#tree').treeview({
68             data: defaultData
69         });
70 
71         //node的单击节点事件
72         $('#tree').on('nodeSelected', function(event, data) {
73            alert(data.tags)
74         });
75 
76     });
77 </script>
78 </body>
79 </html>
View Code

效果如图,单击可以节点的tags属性:

我从thrift获取的结构是一个数组,先返回第一级数据,然后是第二级数据,最后是第三级数据,刚才Demo的数据格式中,我只有根据三级数据数据的fatherid和二级数据的id是否吻合来判断二级数据是否有二级数据,同理判断一级数据是否有二级数据,也就是说,我需要知道所有的数据之后才能知道每个层级的详细数据,然后才能完成Tree格式的数据赋值(我同学让我用递归。我暂时还没明白递归的用法,先按自己的思路来)

所以,思路如下:

首先定义三个空数组,分别存放不同层级的数组,然后遍历从Thrift获取的数组,分别存放到三个空数组中,代码如下:

 1      var node = new Array();
 2         //字符串转数组
 3         node = eval(nodelist);
 4         var nodelength = node.length;
 5 
 6         var nodefather = new Array();
 7         var nodeson = new Array();
 8         var nodegrandson = new Array();
 9         var LawsId = "";
10         var LawsName = "";
11         var LawsFatherId = "";
12 
13         var sonnumber = 0;
14         var groungsonnumber = 0;
15         for (var i = 0; i < nodelength; i++) {
16             if (node[i].NLevel === 1){
17                 LawsId = node[i].NID;
18                 LawsName = node[i].szName;
19                 LawsFatherId = node[i].NParentID;
20                 nodefather[i] = new Array(LawsId,LawsName,LawsFatherId);
21             }
22             if (node[i].NLevel === 2){
23 
24                 LawsId = node[i].NID;
25                 LawsName = node[i].szName;
26                 LawsFatherId = node[i].NParentID;
27                 nodeson[sonnumber]= new Array(LawsId,LawsName,LawsFatherId);
28                 sonnumber++;
29             }
30             if (node[i].NLevel === 3){
31 
32                 LawsId = node[i].NID;
33                 LawsName = node[i].szName;
34                 LawsFatherId = node[i].NParentID;
35                 nodegrandson[groungsonnumber] = new Array(LawsId,LawsName,LawsFatherId);
36                 groungsonnumber++;
37             }
38         }
View Code

分别获取三个层级数据的个数

 var nodefatherLength = nodefather.length;
 var nodeSonLength = nodeson.length;
 var nodeGrandSonLength = nodegrandson.length;

所有数据整理完毕,下面开始字符串的拼接

首先定义一个字符串str;

 var str = "[";

接着循环第一层级的数据  

 1     var str = "[";
 2         for(var i = 0;i<nodefatherLength;i++){
 3             if(i+1 === nodefatherLength){
 4                 str += "{id:'" + nodefather[i][0] + "',text:'" + nodefather[i][1] + "'}";
 5                 break;
 6             }
 7             str += "{id:'" + nodefather[i][0] + "',text:'" + nodefather[i][1] + "'},";
 8         }
 9         str+="];";
10 
11         var nodedata = eval(str);
12 
13         $('#lawsnode').treeview({
14             data: nodedata
15         });
View Code

有个小插曲,在我进行eval()函数转JSON数组之前,这是一个字符串数据,字符串数据添加到tree里面还是无法识别的,当时脑袋一热,用substring()函数选择了1-数组.length-1的索引,放到tree里面发现还是字符串,这才想起来直接eval()转数组

效果如图所示:

  

拼接完一级数据之后,开始拼接二级数据,同理,拼接完三级数据,完成后更新拼接字符串代码如下,我每一行都写了注释,理清逻辑之后还是很好理解的:

  1  //定义一个起始的字符串
  2         var str = "[";
  3         //循环父节点
  4         for(var i = 0;i<nodefatherLength;i++){
  5             //如果到达节点的最后一位
  6             //如果不是最后一个节点,数据字符的末尾需要加一个","隔离开来数据,如果是末尾最后一个数据,则末尾不需要","
  7             if(i+1 === nodefatherLength){
  8                 //拼接字符串
  9                 str += "{id:'" + nodefather[i][0] + "',text:'" + nodefather[i][1] + "'";
 10                 for(var ii = 0;ii<nodeSonLength;ii++){
 11                     //如果有二级子节点
 12                     if(nodeson[ii][2] === nodefather[i][0]){
 13                         //首先判断,前面是否已经生成了node标签,如果没有,说明是首次添加
 14                         //这个判断条件就是字符串的末尾是否为","
 15                         if(str.charAt(str.length - 1) != ","){
 16                             //为字符串添加node属性
 17                             str += ",nodes:[";
 18                         }
 19                         //如果到达数组最后一位
 20                         if(ii+1 === nodeSonLength){
 21                             //如果前一位生成了子节点
 22                             if((nodeson[ii][2] === nodefather[i][0])){
 23                                 str += "{id:'" + nodeson[ii][0] + "',text:'" + nodeson[ii][1]+ "'";
 24                                 for(var iii = 0;iii<nodeGrandSonLength;iii++) {
 25                                     //如果有三级子节点
 26                                     if (nodegrandson[iii][2] === nodeson[ii][0]) {
 27                                         //首先判断,前面是否已经生成了node标签,如果没有,说明是首次添加
 28                                         //这个判断条件就是字符串的末尾是否为","
 29                                         if(str.charAt(str.length - 1) != ","){
 30                                             //为字符串添加node属性
 31                                             str += ",nodes:[";
 32                                         }
 33                                         //如果到达数组最后一位
 34                                         if(iii+1 === nodeGrandSonLength){
 35                                             //如果前一位生成了子节点
 36                                             if((nodegrandson[iii][2] === nodeson[ii][0])){
 37                                                 str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'}]";
 38                                                 break;
 39                                             }
 40                                         }
 41                                         //如果是该节点的最后一个子节点
 42                                         if(nodegrandson[iii+1][2] != nodeson[ii][0] ){
 43                                             //拼接数组
 44                                             str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'}]";
 45                                             //跳出循环
 46                                             break;
 47                                         }
 48                                         else{
 49                                             //添加三级子节点
 50                                             str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'},";
 51                                         }
 52                                     }
 53                                 }
 54                                 str += "}]";
 55                                 break;
 56                             }
 57                         }
 58                         //如果是该节点的最后一个子节点
 59                         if(nodeson[ii+1][2] != nodefather[i][0] ){
 60                             //拼接数组
 61                             str += "{id:'" + nodeson[ii][0] + "',text:'" + nodeson[ii][1]+ "'";
 62                             for(var iii = 0;iii<nodeGrandSonLength;iii++) {
 63                                 //如果有三级子节点
 64                                 if (nodegrandson[iii][2] === nodeson[ii][0]) {
 65                                     //首先判断,前面是否已经生成了node标签,如果没有,说明是首次添加
 66                                     //这个判断条件就是字符串的末尾是否为","
 67                                     if(str.charAt(str.length - 1) != ","){
 68                                         //为字符串添加node属性
 69                                         str += ",nodes:[";
 70                                     }
 71                                     //如果到达数组最后一位
 72                                     if(iii+1 === nodeGrandSonLength){
 73                                         //如果前一位生成了子节点
 74                                         if((nodegrandson[iii][2] === nodeson[ii][0])){
 75                                             str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'}]";
 76                                             break;
 77                                         }
 78                                     }
 79                                     //如果是该节点的最后一个子节点
 80                                     if(nodegrandson[iii+1][2] != nodeson[ii][0] ){
 81                                         //拼接数组
 82                                         str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'}]";
 83                                         //跳出循环
 84                                         break;
 85                                     }
 86                                     else{
 87                                         //添加三级子节点
 88                                         str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'},";
 89                                     }
 90                                 }
 91                             }
 92                             str += "}]";
 93                             //跳出循环
 94                             break;
 95                         }
 96                         //添加二级子节点
 97                         else{
 98                             str += "{id:'" + nodeson[ii][0] + "',text:'" + nodeson[ii][1]+ "'";
 99                             //循环三级数据存放的数组,判断是否有孙节点
100                             for(var iii = 0;iii<nodeGrandSonLength;iii++) {
101                                 //如果有三级子节点
102                                 if (nodegrandson[iii][2] === nodeson[ii][0]) {
103                                     //首先判断,前面是否已经生成了node标签,如果没有,说明是首次添加
104                                     //这个判断条件就是字符串的末尾是否为","
105                                     if(str.charAt(str.length - 1) != ","){
106                                         //为字符串添加node属性
107                                         str += ",nodes:[";
108                                     }
109                                     //如果到达数组最后一位
110                                     if(iii+1 === nodeGrandSonLength){
111                                         //如果前一位生成了子节点
112                                         if((nodegrandson[iii][2] === nodeson[ii][0])){
113                                             str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'}]";
114                                             break;
115                                         }
116                                     }
117                                     //如果是该节点的最后一个子节点
118                                     if(nodegrandson[iii+1][2] != nodeson[ii][0] ){
119                                         //拼接数组
120                                         str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'}]";
121                                         //跳出循环
122                                         break;
123                                     }
124                                     else{
125                                         //添加三级子节点
126                                         str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'},";
127                                     }
128                                 }
129                             }
130                             str += "},"
131                         }
132 
133                     }
134                 }
135                 //跳出循环
136                 break;
137             }
138             //如果不是节点的最后一位
139             str += "{id:'" + nodefather[i][0] + "',text:'" + nodefather[i][1]+ "'" ;
140             //循环二级数据存放的数组,判断是否有子节点
141             for(var ii = 0;ii<nodeSonLength;ii++){
142                 //如果有二级子节点
143                 if(nodeson[ii][2] === nodefather[i][0]){
144                     //首先判断,前面是否已经生成了node标签,如果没有,说明是首次添加
145                     //这个判断条件就是字符串的末尾是否为","
146                     if(str.charAt(str.length - 1) != ","){
147                         //为字符串添加node属性
148                         str += ",nodes:[";
149                     }
150                     //如果到达数组最后一位
151                     if(ii+1 === nodeSonLength){
152                         //如果前一位生成了子节点
153                         if((nodeson[ii][2] === nodefather[i][0])){
154                             str += "{id:'" + nodeson[ii][0] + "',text:'" + nodeson[ii][1]+ "'";
155                             for(var iii = 0;iii<nodeGrandSonLength;iii++) {
156                                 //如果有三级子节点
157                                 if (nodegrandson[iii][2] === nodeson[ii][0]) {
158                                     //首先判断,前面是否已经生成了node标签,如果没有,说明是首次添加
159                                     //这个判断条件就是字符串的末尾是否为","
160                                     if(str.charAt(str.length - 1) != ","){
161                                         //为字符串添加node属性
162                                         str += ",nodes:[";
163                                     }
164                                     //如果到达数组最后一位
165                                     if(iii+1 === nodeGrandSonLength){
166                                         //如果前一位生成了子节点
167                                         if((nodegrandson[iii][2] === nodeson[ii][0])){
168                                             str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'}]";
169                                             break;
170                                         }
171                                     }
172                                     //如果是该节点的最后一个子节点
173                                     if(nodegrandson[iii+1][2] != nodeson[ii][0] ){
174                                         //拼接数组
175                                         str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'}]";
176                                         //跳出循环
177                                         break;
178                                     }
179                                     else{
180                                         //添加三级子节点
181                                         str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'},";
182                                     }
183                                 }
184                             }
185                             str += "}]";
186                             break;
187                         }
188                     }
189                     //如果是该节点的最后一个子节点
190                     if(nodeson[ii+1][2] != nodefather[i][0] ){
191                         //拼接数组
192                         str += "{id:'" + nodeson[ii][0] + "',text:'" + nodeson[ii][1]+ "'";
193                         for(var iii = 0;iii<nodeGrandSonLength;iii++) {
194                             //如果有三级子节点
195                             if (nodegrandson[iii][2] === nodeson[ii][0]) {
196                                 //首先判断,前面是否已经生成了node标签,如果没有,说明是首次添加
197                                 //这个判断条件就是字符串的末尾是否为","
198                                 if(str.charAt(str.length - 1) != ","){
199                                     //为字符串添加node属性
200                                     str += ",nodes:[";
201                                 }
202                                 //如果到达数组最后一位
203                                 if(iii+1 === nodeGrandSonLength){
204                                     //如果前一位生成了子节点
205                                     if((nodegrandson[iii][2] === nodeson[ii][0])){
206                                         str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'}]";
207                                         break;
208                                     }
209                                 }
210                                 //如果是该节点的最后一个子节点
211                                 if(nodegrandson[iii+1][2] != nodeson[ii][0] ){
212                                     //拼接数组
213                                     str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'}]";
214                                     //跳出循环
215                                     break;
216                                 }
217                                 else{
218                                     //添加三级子节点
219                                     str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'},";
220                                 }
221                             }
222                         }
223                         str += "}]";
224                         //跳出循环
225                         break;
226                     }
227                     //添加二级子节点
228                     else{
229                         str += "{id:'" + nodeson[ii][0] + "',text:'" + nodeson[ii][1]+ "'";
230                         //循环三级数据存放的数组,判断是否有孙节点
231                         for(var iii = 0;iii<nodeGrandSonLength;iii++) {
232                             //如果有三级子节点
233                             if (nodegrandson[iii][2] === nodeson[ii][0]) {
234                                 //首先判断,前面是否已经生成了node标签,如果没有,说明是首次添加
235                                 //这个判断条件就是字符串的末尾是否为","
236                                 if(str.charAt(str.length - 1) != ","){
237                                     //为字符串添加node属性
238                                     str += ",nodes:[";
239                                 }
240                                 //如果到达数组最后一位
241                                 if(iii+1 === nodeGrandSonLength){
242                                     //如果前一位生成了子节点
243                                     if((nodegrandson[iii][2] === nodeson[ii][0])){
244                                         str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'}]";
245                                         break;
246                                     }
247                                 }
248                                 //如果是该节点的最后一个子节点
249                                 if(nodegrandson[iii+1][2] != nodeson[ii][0] ){
250                                     //拼接数组
251                                     str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'}]";
252                                     //跳出循环
253                                     break;
254                                 }
255                                 else{
256                                     //添加三级子节点
257                                      str += "{id:'" + nodegrandson[iii][0] + "',text:'" + nodegrandson[iii][1]+ "'},";
258                                 }
259                             }
260                         }
261                         str += "},"
262                     }
263 
264                 }
265             }
266             //子节点的拼接
267             str += "},";
268         }
269         //字符串的末尾收尾
270         str+="}];";
View Code

效果如图所示:

 

可以看到三级数据还是显示的很清楚的

代码写的有些匆忙,大量的重复代码和大姨妈一般的注释,我封装了一下,代码如下:

 1  var i = 0;
 2         var ii = 0;
 3         var iii = 0;
 4 
 5         var str = "[";
 6         for(i = 0;i<nodefatherLength;i++){
 7             if(i+1 === nodefatherLength){
 8                 str += "{id:'" + nodefather[i][0] + "',text:'" + nodefather[i][1] + "'";
 9                 StringSonNode(nodeson);
10                 break;
11             }
12             str += "{id:'" + nodefather[i][0] + "',text:'" + nodefather[i][1]+ "'" ;
13             StringSonNode(nodeson);
14             str += "},";
15         }
16         str+="}];";
17 
18         //生成子节点
19         function StringSonNode(son) {
20             for(ii = 0;ii<nodeSonLength;ii++){
21                 if(son[ii][2] === nodefather[i][0]){
22                     if(str.charAt(str.length - 1) !== ","){
23                         str += ",nodes:[";
24                     }
25                     if(ii+1 === nodeSonLength){
26                         if((son[ii][2] === nodefather[i][0])){
27                             str += "{id:'" + son[ii][0] + "',text:'" + son[ii][1]+ "'";
28                             StringGrandSonNode(nodegrandson);
29                             str += "}]";
30                             break;
31                         }
32                     }
33                     if(son[ii+1][2] !== nodefather[i][0] ){
34                         str += "{id:'" + son[ii][0] + "',text:'" + son[ii][1]+ "'";
35                         StringGrandSonNode(nodegrandson);
36                         str += "}]";
37                         break;
38                     }
39                     else{
40                         str += "{id:'" + son[ii][0] + "',text:'" + son[ii][1]+ "'";
41                         StringGrandSonNode(nodegrandson);
42                         str += "},"
43                     }
44 
45                 }
46             }
47         }
48 
49         //生成孙节点
50         function StringGrandSonNode(grandson) {
51             for(iii = 0;iii<nodeGrandSonLength;iii++) {
52                 if (grandson[iii][2] === nodeson[ii][0]) {
53                     if(str.charAt(str.length - 1) !== ","){
54                         str += ",nodes:[";
55                     }
56                     if(iii+1 === nodeGrandSonLength){
57                         if((grandson[iii][2] === nodeson[ii][0])){
58                             str += "{id:'" + grandson[iii][0] + "',text:'" + grandson[iii][1]+ "'}]";
59                             break;
60                         }
61                     }
62                     if(nodegrandson[iii+1][2] !== nodeson[ii][0] ){
63                         str += "{id:'" + grandson[iii][0] + "',text:'" + grandson[iii][1]+ "'}]";
64                         break;
65                     }
66                     else{
67                         str += "{id:'" + grandson[iii][0] + "',text:'" + grandson[iii][1]+ "'},";
68                     }
69                 }
70             }
71         }
View Code

 

posted @ 2017-08-10 20:15  StephenCurry  阅读(1387)  评论(0编辑  收藏  举报