2016-03-08 74 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