2016-03-08 54 views
3

我從服務器JSON數組,但它並沒有形成正確的,像如何通過一個鍵將一個深度json轉換爲多個深度?

[ 
    { 
     "id": 2, 
     "parentId": 1, 
    }, 
    { 
     "id": 3, 
     "parentId": 2, 
    } 
    ] 

當然,數組的第二個項目應該是一個子項到第一個,因爲它的關鍵「的parentId」的,像

[ 
    { 
     "id": 2, 
     "parentId": 1, 
     "children": [ 
      { 
       "id": 3, 
       "parentId": 2, 
      } 
     ] 
    } 
] 

如何將第一種形式的JSON轉換爲第二種?

+0

這就好比自引用RDMS分貝錶轉換爲分層的。這不是直截了當的算法可能會有基於數據量的性能暗示 – gurvinder372

回答

2

建議創建樹並將給定的parentId作爲樹的根。

工作原理:

基本上爲數組中的每個對象都需要爲好id爲建設一個新的對象,以及在parentId一個新的對象。

因此,例如

{ "id": 6, "parentId": 4 } 

id

"6": { 
    "id": 6, 
    "parentId": 4 
} 

,然後這種結構首先生成與parentId

"4": { 
    "children": [ 
     { 
      "id": 6, 
      "parentId": 4 
     } 
    ] 
}, 

,雖然這樣對待所有的對象,我們終於得到了樹。如果parentId === root找到根節點,這是後來回報的對象。

var data = [{ "id": 1, "parentId": 0 }, { "id": 6, "parentId": 4 }, { "id": 4, "parentId": 1 }], 
 
    tree = function (data, root) { 
 
     var r, o = {}; 
 
     data.forEach(function (a) { 
 
      a.children = o[a.id] && o[a.id].children; 
 
      o[a.id] = a; 
 
      if (a.parentId === root) { 
 
       r = a; 
 
      } else { 
 
       o[a.parentId] = o[a.parentId] || {}; 
 
       o[a.parentId].children = o[a.parentId].children || []; 
 
       o[a.parentId].children.push(a); 
 
      } 
 
     }); 
 
     return r; 
 
    }(data, 0); 
 
    
 
document.write('<pre>' + JSON.stringify(tree, 0, 4) + '</pre>');

+0

設置一個根號碼是一個好主意,thx – markjiang

+0

起初我以爲我可以從服務器得到一個根號碼,現在我發現我不能。有任何想法讓它沒有根號碼的工作? – markjiang

+0

我明白了,男人,我太愚蠢了,不去想它!我處理服務器開發人員的根號碼,非常感謝 – markjiang