2016-11-12 1 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 배열 및이 배열의 내부에 기존 루트 객체를 넣고 자합니다. childrenEvents 배열

누군가가 문제를 해결하는 데 도움이된다면 고맙게 생각합니다. 미리 감사드립니다.

내 시도는

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

누군가가 SO 당신을 위해 이것을 코드 및 기대처럼 그렇지 않으면 그냥 보이는 .... 당신이 작동하지 않는 시도 어떤 코드 작성 서비스 – charlietfl

+0

되지 제시해주십시오 @charlietfl 몇 분합시다. – antonyboom

+0

@charlietfl 업데이트 대답을 확인하십시오 – antonyboom

답변

3

어쩌면이 가까운 것을 (그것을 실행하지 않은) ... .

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()으로 전화해야합니다. 당신은 모든 종속성을 구축하고 트리로

parentEvent === null 

와 단지 하나를 수행하는 객체를 사용할 수

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; 

} 
관련 문제