2015-04-28 50 views
1

我想從我的sql查詢中構建分層數據結構。 繼this post之後從平面對象中構建分層JSON對象後,我嘗試在對象層次中創建具有更多屬性的4級層次結構,但不需要子屬性。Node.js - 將平面json轉換爲沒有'parent','child'屬性的層次結構json

我怎樣才能做到這一點?

這裏是我的JavaScript(的NodeJS)代碼:

var levels = ["counties_id","district_id", "municipalities_id", "institutes_id"]; 
data.forEach(function(d){ 
    var depthCursor = newData.counties; 
    levels.forEach(function(property, depth){ 
     var index; 
     depthCursor.forEach(function(child,i){ 
      if (d[property] == child.counties_id) index = i; 
     }); 
     if (isNaN(index)) { 
      var propname = levels[depth]; 
      var obj = {}; 
      obj[propname] = d[property]; 
      obj["children"] = []; 
      depthCursor.push(obj); 
      index = depthCursor.length - 1; 
     } 
     depthCursor = depthCursor[index].children; 
     if (depth === levels.length - 1) { 
      depthCursor.push({ id : d.id, name : d.name, name_H : d.name_h }); 
     } 
    }); 
}); 

第一級是確定的,因爲這equalation檢查相同的第一級別屬性:

if (d[property] == child.counties_id) index = i; 

我怎樣才能chect二路,3TH和第四級相同的情況?

這是平坦的對象,它一直努力:我目前的代碼

[ 
{ 
"counties_h":"Megye 1", 
"counties_en":"Coun 1", 
"counties_id":"1", 
"district_h":"Korz 1", 
"district_en":"Dist 1", 
"district_id":"101", 
"municipalities_h":"Onk 1", 
"municipalities_en":"Mun 1", 
"municipalities_id":"asdf", 
"institutes_h":"Int 1", 
"institites_en":"Inst 1", 
"institutes_id":"1" 
}, 
{ 
"counties_h":"Megye 1", 
"counties_en":"Coun 1", 
"counties_id":"1", 
"district_h":"Korz 1", 
"district_en":"Dist 1", 
"district_id":"101", 
"municipalities_h":"Onk 1", 
"municipalities_en":"Mun 1", 
"municipalities_id":"asdf", 
"institutes_h":"Int 2", 
"institites_en":"Inst 2", 
"institutes_id":"2" 
}, 
{ 
"counties_h":"Megye 1", 
"counties_en":"Coun 1", 
"counties_id":"1", 
"district_h":"Korz 1", 
"district_en":"Dist 1", 
"district_id":"101", 
"municipalities_h":"Onk 2", 
"municipalities_en":"Mun 2", 
"municipalities_id":"sdfg", 
"institutes_h":"Int 1", 
"institites_en":"Inst 1", 
"institutes_id":"1" 
}, 
{ 
"counties_h":"Megye 1", 
"counties_en":"Coun 1", 
"counties_id":"1", 
"district_h":"Korz 1", 
"district_en":"Dist 1", 
"district_id":"101", 
"municipalities_h":"Onk 2", 
"municipalities_en":"Mun 2", 
"municipalities_id":"sdfg", 
"institutes_h":"Int 2", 
"institites_en":"Inst 2", 
"institutes_id":"2" 
}, 
{ 
"counties_h":"Megye 1", 
"counties_en":"Coun 1", 
"counties_id":"1", 
"district_h":"Korz 2", 
"district_en":"Dist 2", 
"district_id":"102", 
"municipalities_h":"Onk 1", 
"municipalities_en":"Mun 1", 
"municipalities_id":"dfgh", 
"institutes_h":"Int 1", 
"institites_en":"Inst 1", 
"institutes_id":"1" 
}, 
{ 
"counties_h":"Megye 1", 
"counties_en":"Coun 1", 
"counties_id":"1", 
"district_h":"Korz 2", 
"district_en":"Dist 2", 
"district_id":"102", 
"municipalities_h":"Onk 1", 
"municipalities_en":"Mun 1", 
"municipalities_id":"dfgh", 
"institutes_h":"Int 2", 
"institites_en":"Inst 2", 
"institutes_id":"2" 
}, 
{ 
"counties_h":"Megye 2", 
"counties_en":"Coun 2", 
"counties_id":"2", 
"district_h":"Korz 2", 
"district_en":"Dist 2", 
"district_id":"202", 
"municipalities_h":"Onk 1", 
"municipalities_en":"Mun 1", 
"municipalities_id":"fghj", 
"institutes_h":"Int 1", 
"institites_en":"Inst 1", 
"institutes_id":"1" 
}, 
{ 
"counties_h":"Megye 2", 
"counties_en":"Coun 2", 
"counties_id":"2", 
"district_h":"Korz 2", 
"district_en":"Dist 2", 
"district_id":"202", 
"municipalities_h":"Onk 1", 
"municipalities_en":"Mun 1", 
"municipalities_id":"fghj", 
"institutes_h":"Int 2", 
"institites_en":"Inst 2", 
"institutes_id":"2" 
} 
] 

輸出:

{ 
    "counties":[ 
     { 
     "counties_id":"1", 
     "children":[ 
      { 
       "district_id":"101", 
       "children":[ 
        { 
        "municipalities_id":"asdf", 
        "children":[ 
         { 
          "institutes_id":"1", 
          "children":[ 
           { 

           } 
          ] 
         } 
        ] 
        } 
       ] 
      }, 
      { 
       "district_id":"101", 
       "children":[ 
        { 
        "municipalities_id":"asdf", 
        "children":[ 
         { 
          "institutes_id":"2", 
          "children":[ 
           { 

           } 
          ] 
         } 
        ] 
        } 
       ] 
      }, 
      { 
       "district_id":"101", 
       "children":[ 
        { 
        "municipalities_id":"sdfg", 
        "children":[ 
         { 
          "institutes_id":"1", 
          "children":[ 
           { 

           } 
          ] 
         } 
        ] 
        } 
       ] 
      }, 
      { 
       "district_id":"101", 
       "children":[ 
        { 
        "municipalities_id":"sdfg", 
        "children":[ 
         { 
          "institutes_id":"2", 
          "children":[ 
           { 

           } 
          ] 
         } 
        ] 
        } 
       ] 
      }, 
      { 
       "district_id":"102", 
       "children":[ 
        { 
        "municipalities_id":"dfgh", 
        "children":[ 
         { 
          "institutes_id":"1", 
          "children":[ 
           { 

           } 
          ] 
         } 
        ] 
        } 
       ] 
      }, 
      { 
       "district_id":"102", 
       "children":[ 
        { 
        "municipalities_id":"dfgh", 
        "children":[ 
         { 
          "institutes_id":"2", 
          "children":[ 
           { 

           } 
          ] 
         } 
        ] 
        } 
       ] 
      } 
     ] 
     }, 
     { 
     "counties_id":"2", 
     "children":[ 
      { 
       "district_id":"202", 
       "children":[ 
        { 
        "municipalities_id":"fghj", 
        "children":[ 
         { 
          "institutes_id":"1", 
          "children":[ 
           { 

           } 
          ] 
         } 
        ] 
        } 
       ] 
      }, 
      { 
       "district_id":"202", 
       "children":[ 
        { 
        "municipalities_id":"fghj", 
        "children":[ 
         { 
          "institutes_id":"2", 
          "children":[ 
           { 

           } 
          ] 
         } 
        ] 
        } 
       ] 
      } 
     ] 
     } 
    ] 
} 

而這正是我想要的:

{ 
    "counties":[ 
     { 
     "counties_id":"1", 
     "counties_h":"Megye 1", 
     "counties_en":"Coun 1", 
     "districts":[ 
      { 
       "district_id":"101", 
       "district_h":"Korz 1", 
       "district_en":"Dist 1", 
       "municipalities":[ 
        { 
        "municipalities_id":"asdf", 
        "municipalities_h":"Onk 1", 
        "municipalities_en":"Mun 1", 
        "institutes":[ 
         { 
          "institutes_id":"1", 
          "institutes_h":"Int 1", 
          "institutes_en":"Inst 1" 
         }, 
         { 
          "institutes_id":"2", 
          "institutes_h":"Int 2", 
          "institutes_en":"Inst 2" 
         } 
        ] 
        }, 
        { 
        "municipalities_id":"sdfg", 
        "municipalities_h":"Onk 2", 
        "municipalities_en":"Mun 2", 
        "institutes":[ 
         { 
          "institutes_id":"3", 
          "institutes_h":"Int 1", 
          "institutes_en":"Inst 1" 
         }, 
         { 
          "institutes_id":"4", 
          "institutes_h":"Int 2", 
          "institutes_en":"Inst 2" 
         } 
        ] 
        } 
       ] 
      }, 
      { 
       "district_id":"102", 
       "district_h":"Korz 2", 
       "district_en":"Dist 2", 
       "municipalities":[ 
        { 
        "municipalities_id":"dfgh", 
        "municipalities_h":"Onk 1", 
        "municipalities_en":"Mun 1", 
        "institutes":[ 
         { 
          "institutes_id":"5", 
          "institutes_h":"Int 1", 
          "institutes_en":"Inst 1" 
         }, 
         { 
          "institutes_id":"6", 
          "institutes_h":"Int 2", 
          "institutes_en":"Inst 2" 
         } 
        ] 
        } 
       ] 
      } 
     ] 
     }, 
     { 
     "counties_id":"2", 
     "counties_h":"Megye 2", 
     "counties_en":"Coun 2", 
     "districts":[ 
      { 
       "district_id":"202", 
       "district_h":"Korz 2", 
       "district_en":"Dist 2", 
       "municipalities":[ 
        { 
        "municipalities_id":"fghj", 
        "municipalities_h":"Onk 1", 
        "municipalities_en":"Mun 1", 
        "institutes":[ 
         { 
          "institutes_id":"7", 
          "institutes_h":"Int 1", 
          "institutes_en":"Inst 1" 
         }, 
         { 
          "institutes_id":"8", 
          "institutes_h":"Int 2", 
          "institutes_en":"Inst 2" 
         } 
        ] 
        } 
       ] 
      } 
     ] 
     } 
    ] 
} 
+0

JSON應該在服務器中格式化併發送到客戶端。你正在嘗試的方法是一個不好的做法。 –

+0

這個JSON格式在服務器端(使用NodeJS)和我將發送給客戶端的輸出。 – lgabster

回答