2016-11-12 152 views
0

我需要递归转换json对象到另一个json对象的帮助。递归转换json对象

我输入对象是这样的:

var my_obj = { 
    "id": 22, 
    "eventTypeId": 37, 
    "eventTypeName": "CommonOnly", 
    "parentEvent": { 
    "id": 21, 
    "eventTypeId": 35, 
    "eventTypeName": "FullTest", 
    "parentEvent": { 
     "id": 20, 
     "parentEvent": null, 
     "eventTypeId": 38, 
     "eventTypeName": "FullTest" 
    } 
    }, 
    "childrenEvents": [ 
    { 
     "id": 24, 
     "parentEventId": 22, 
     "eventTypeId": 36, 
     "eventTypeName": "BlindedTest", 
     "childrenEvents": [] 
    }, 
    { 
     "id": 23, 
     "parentEventId": 22, 
     "eventTypeId": 38, 
     "eventTypeName": "OneCustom", 
     "childrenEvents": [] 
    } 
    ] 
} 

我想输出是:

var my_obj = { 
"id": 20, 
"eventTypeId": 38, 
"parentEvent": null, 
"eventTypeName": "FullTest", 
"childrenEvents": [{ 
    "id": 21, 
    "eventTypeId": 35, 
    "eventTypeName": "FullTest", 
    "childrenEvents": [ 
     { 
      "id": 22, 
      "eventTypeId": 37, 
      "eventTypeName": "CommonOnly", 
      "childrenEvents": [ 
       { 
        "id": 24, 
        "parentEventId": 22, 
        "eventTypeId": 36, 
        "eventTypeName": "BlindedTest", 
        "childrenEvents": [] 
       }, { 
        "id": 23, 
        "parentEventId": 22, 
        "eventTypeId": 38, 
        "eventTypeName": "OneCustom", 
        "childrenEvents": [] 
       } 
      ] 
     } 
    ] 
}] 

}

所以,我希望能够得到一个对象,其中第二parentEventparentEvent = null已成为一个根元素,与数组childrenEvents,里面的子数组将与其自己的第一个父事件对象childrenEvents array和这个数组的内部我想把现有的根对象与它自己的childrenEvents array

我很感谢有人能帮我解决它。提前致谢。

我尝试

function rebuild(input) 
{ 
    var childrenEvents = [] ; 

    for (f in input.parentEvent) // we may have attributes other than "age" 
    if (f.parentEvent == null) { 
     f.parentEvent.push(childrenEvents); 
    } 
    else { 
      f.parentEvent.push(input.parentEvent[f]); 
    } 

    if (input.childrenEvents.length !== 0) 
    { 
     input.parentEvent[f].push(input.childrenEvents) 
    } 

    return input; 
} 

    console.log(rebuild($scope.myObj)) 

}); 

plunker

+1

请出示你已经试过什么不工作....否则它只是看起来像你期望别人为你的代码这一点,所以是不是一个代码编写服务 – charlietfl

+0

@charlietfl让我们夫妇分钟 – antonyboom

+0

@charlietfl请检查更新回答 – antonyboom

回答

3

你可以使用一个对象来构建所有的依赖,并采取只有一个与

parentEvent === null 

的树。

var my_obj = { "id": 22, "eventTypeId": 37, "eventTypeName": "CommonOnly", "parentEvent": { "id": 21, "eventTypeId": 35, "eventTypeName": "FullTest", "parentEvent": { "id": 20, "parentEvent": null, "eventTypeId": 38, "eventTypeName": "FullTest" } }, "childrenEvents": [{ "id": 24, "parentEventId": 22, "eventTypeId": 36, "eventTypeName": "BlindedTest", "childrenEvents": [] }, { "id": 23, "parentEventId": 22, "eventTypeId": 38, "eventTypeName": "OneCustom", "childrenEvents": [] }] }, 
 
    tree = function (data, root) { 
 
     function iter(a) { 
 
      var parent; 
 
      if (a.childrenEvents && Array.isArray(a.childrenEvents)) { 
 
       a.childrenEvents.forEach(iter); 
 
      } 
 
      a.childrenEvents = o[a.id] && o[a.id].childrenEvents; 
 
      o[a.id] = a; 
 
      if (a.parentEvent === root) { 
 
       r = a; 
 
      } else { 
 
       if (a.parentEvent && 'id' in a.parentEvent) { 
 
        parent = a.parentEvent.id; 
 
       } 
 
       if ('parentEventId' in a) { 
 
        parent = a.parentEventId; 
 
       } 
 
       if (parent !== undefined) { 
 
        o[parent] = o[parent] || {}; 
 
        o[parent].childrenEvents = o[parent].childrenEvents || []; 
 
        o[parent].childrenEvents.push(a); 
 
       } 
 
      } 
 
      if (a.parentEvent) { 
 
       iter(a.parentEvent); 
 
       delete a.parentEvent; 
 
      } 
 
     } 
 

 
     var r, o = {}; 
 
     iter(data); 
 
     return r; 
 
    }(my_obj, null); 
 

 
console.log(tree);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

我一直都没有解决方案...希望它会随着时间的推移。谢谢,我很感激。 – antonyboom

-1

你的问题的标题说,“递归”,但没有递归(我可以看到)在你的代码。哟需要从rebuild() ...递归调用rebuild()

也许更接近于这个(没有运行)...

function rebuild(input) { 

    var rslt = input; // If it stays this way, we've reached the end of the line 

    var parent = inpt.parentEvent; 
    if (parent) { 
     parent.childrenEvents = []; 
     parent.childrenEvents.push(input); 
     inpt.parentEventId = parent.id; 
     rslt = rebuild(parent); 
    } 

    return rslt; 

}