2012-11-02 164 views
1

我有一个JSON树结构:JSON树于母公司连杆结构

nodes = 
[ 
{ 
    "name": "user1", 
    "children": [ 
     { 
      "name": "user2" 
     }, 
     { 
      "name": "user3", 
      "children": [ 
       { 
        "name": "user4" 
       } 
      ] 
     }, 
     { 
      "name": "user5" 
     } 
    ] 
} 
] 

,我想转换到父连杆结构:

[{"name": "user1","parent": "null"}, 
{"name": "user2","parent": "user1"}, 
{"name": "user3","parent": "user1"}, 
{"name": "user4","parent": "user3"}, 
{"name": "user5","parent": "user1"}] 

我试图穿越树递归但没有成功访问父对象:

rebuild(nodes,parentLink); 

function parentlink(key,value) { 
    var obj = { name: value , parent: ??? }; 
    if (key == "name"){ 
     nodes.push(obj); 
    } 
} 

function rebuild(o,func) { 
    for (i in o) { 
     func.apply(this,[i,o[i]]) 
     if (typeof(o[i])=="object") { 
     traverse(o[i],func,nodes); 
     } 
    } 
} 

在开发人员工具中,我可以看到父对象每个孩子,但我不知道如何访问它们。我应该怎么做才能将父母添加到每个用户?

回答

2

我不会说谎,我没有理会看着你的代码 - 这是我会怎么做:

http://jsfiddle.net/J6G2W/1/

function processChildren(item, ret, parent) { 
    for (var i = 0; i < item.length; i++) { 
     var cur = item[i]; 
     var cur_name = cur.name; 
     ret.push({"user": cur_name, "parent": parent}); 
     if ("children" in cur && cur.children.length > 0) { 
      processChildren(cur.children, ret, cur_name); 
     } 
    } 
} 

var all = []; 

processChildren(nodes, all, null); 

console.log(JSON.stringify(all)); 

输出是:

[{"user":"user1","parent":null},{"user":"user2","parent":"user1"},{"user":"user3","parent":"user1"},{"user":"user4","parent":"user3"},{"user":"user5","parent":"user1"}] 

这似乎是你在找什么。欢迎您来修改我的代码什么的工作更像是你的,我只是想我会分享什么我会做:)

UPDATE

如果由于某种原因,你想使之更加扩展,你可以自定义哪些键是“名”,并且是“孩子” ......例如:

http://jsfiddle.net/J6G2W/2/

function startProcess(item, ret, key_look, children_look, parent) { 
    function processChildren(item2, ret2, parent2) { 
     for (var i = 0; i < item2.length; i++) { 
      var cur = item2[i]; 
      var cur_name = key_look in cur ? cur[key_look] : null; 

      ret.push({"user": cur_name, "parent": parent2}); 
      if (children_look in cur && cur[children_look].length > 0) { 
       processChildren(cur[children_look], ret, cur_name); 
      } 
     } 
    } 

    processChildren(item, ret, parent); 
} 

var all = []; 

startProcess(nodes, all, "name", "children", null); 

console.log(JSON.stringify(all)); 

注意如何,你只需要指定key_look, children_look AR一次尝试。内部函数可以访问这些参数,而只传递每个递归的重要事情。这可能并不重要,我只是想弄明白:)

+0

谢谢,很好!递归传递父代是事物。 – graphmeter

+0

@graphmeter没问题!我做了更多的定制更新,但它可能没有必要,只是有趣的搞清楚! – Ian

+0

谢谢!不错的功能,它可能会在稍后的一点:)。 – graphmeter