2017-12-26 34 views
2
나는 현재이 양식에 의해 주어진 나무, 변환하려고

:
변형 트리를 재귀 적 JS/ES6의

{ 
"name": "root", 
"children": 
    [{"name":"Parent", 
     "children": 
      [{ 
      "name":"Child1", 
      "children": ["toy1"] 
      }, 
      { 
      "name":"Child2" 
      "children": 
       [{ 
       "name":"Nephew", 
       "children": ["toy2", "toy3"] 
       }] 
      }] 
    }] 
} 
: 다음과 같은 형식의 트리로

{"Parent": 
    { 
    "Child1": ["toy1"], 
    "Child2": 
      { 
       "Nephew": ["toy2", "toy3"] 
      } 
    } 
} 



그래서 기본적으로 나는 나무의 구조를 표준화하고 싶습니다. 나는 시도 그 다음 코드 :

function recurse(elem) { 
    if (typeof(elem) !== "object") return elem; 
    level = []; 
    for (let part in elem) { 
     level.push({ 
      name: part, 
      children: recurse(elem[part]) 
     }); 
     console.log(level); 
    } 
    return level; 
} 
restrucTree = { 
    name: "root", 
    children: recurse(tree) 
}; 

하지만 분명히 (이 경우 "부모"의) 루트 노드부터 객체의 정확한 재귀 및 건물에 관한 약간의 오류가 거기에 포함되어 있지 않습니다 있습니다 변형 된 트리. 또한 트리가 여러 하위 트리에서 분기되는 경우이 메서드는 실패합니다. 이 경우 마지막 하나만 인식됩니다. 가장 좋은 추측은 재귀 스택을 팝하는 동안 저장된 객체가 손실되지만 어떻게 든 솔루션으로 변환 할 수 없다는 것입니다. 이 오류가 발생한 곳에서 생각해보십시오. 매우 감사하게 생각합니다.

답변

0

재귀 적 접근 방식을 취하여 모든 키를 반복하고 새 객체를 작성한 다음 배열을 가져 오거나 다음 재귀 호출을 위해 객체를 가져올 수 있습니다.

function getParts(object) { 
 
    return Array.isArray(object) 
 
     ? object 
 
     : Object.keys(object).map(function (k) { 
 
      return { name: k, children: getParts(object[k]) }; 
 
     }); 
 
} 
 

 
var data = { Parent: { Child1: ["toy1"], Child2: { Nephew: ["toy2", "toy3"] } } }, 
 
    result = { name: 'root', children: getParts(data) }; 
 

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

+0

은 와우, 마법처럼 작동합니다! 빠른 도움에 감사드립니다. 내 코드에서 내 실수가있는 곳을 보셨습니까? – wittenator

+0

개체를 확인하지만 배열도 개체입니다. 배열에 대한 검사가 필요합니다. –

+0

흠, 그게 사실이지만, 순회의 잎 부분은 실제로 괜찮 았어. 한 번에 여러 가지 가지를 사용하는 것이 아니라 다른 형제 - 하위 트리에서 이전에 수집 된 모든 정보를 삭제하는 것처럼 보였습니다. 그럼에도 불구하고, 어쩌면 내가 직접 알아볼 것이다. – wittenator