2012-01-14 1 views
3

저는 하루 종일 자바 스크립트에서 재귀 함수를 작성하여 크기를 얻으려고했습니다. 도움이 필요합니다 :/javascript에서 다양한 깊이의 JSON 객체의 크기를 얻으려면 어떻게해야합니까?

기본적으로 내 JSON 개체에는 계층 적 범주/하위 범주가 포함되어 있습니다. 각 카테고리/하위 카테고리의 크기를 결정하고 싶습니다. 내가 왼쪽에있는 JSON을 오른쪽에 HTML을 좀하고 싶습니다 http://pastehtml.com/view/bkpzzlabs.html

:

다음은 간단한 예제이다. 아마도 나는이 컴퓨터 모니터를 너무 오래 꼼짝 않고 바라 보았을 것입니다. 왜냐하면 저의 삶에 대해 이것을 이해할 수 없기 때문입니다.

도움을 주셔서 대단히 감사드립니다.

+0

코드를 작성한 적이 있습니까? 당신이 가지고있는 것을 보여주십시오. – Hogan

+0

@Hogan http://codepad.org/Wjlr1rJW –

답변

3

"데모"의 오른쪽은 JSON의 총 끝점 수 (또는 "leafs")를 재귀 적으로 계산하기를 원하지 않는다는 것을 의미합니다. 트리의 각 범주 (비 리프 노드)에 대한 재귀 크기를 알고 싶습니다. 여기서 핵심은 잎과 뿌리 사이의 노드가 중요하지 않다는 것입니다.

업데이트 :; 아래를 읽으십시오.

이 시도 : 새 키 'num_children' 트리의 각 잎 이외의 노드에 추가되도록

function parseTree(parent) { 
    var hasNonLeafNodes = false; 
    var childCount = 0; 

    for (var child in parent) { 
     if (typeof parent[child] === 'object') { 
      // Parse this sub-category: 
      childCount += parseTree(parent[child]); 
      // Set the hasNonLeafNodes flag (used below): 
      hasNonLeafNodes = true; 
     } 
    } 

    if (hasNonLeafNodes) { 
     // Add 'num_children' element and return the recursive result: 
     parent.num_children = childCount; 
     return childCount; 
    } else { 
     // This is a leaf item, so return 1: 
     return 1; 
    } 
} 

이 기능은 , 원래 객체를 수정합니다. 을 모든 parent의 자손에있는 전체 리프 노드 수로 반환합니다. 객체의 하위 집합에서이 함수를 호출 할 수도 있습니다. 그것에 대해 죄송합니다 http://jsfiddle.net/PPvG/CXXaB/

:

여기에 라이브 데모입니다! 나는 조금 다른 것을해야했고, 분명히 내가 여기서하고 있었던 것을 잊었다 ...-)

업데이트 된 솔루션은 주소를 올바르게 계산해야하지만 배열에는 이름이 지정된 키 (예 : num_children). 이 예는 귀하의 예와 관련이 있습니다. "Pothole"은 배열입니다.

+0

시간을내어 작성해 주셔서 감사합니다! num_children 값이 실제로 _double_ 인 것처럼 보이지만 지금 해결할 수 있는지보고자합니다. –

+0

@Tobias : 죄송합니다! 거기에 약간의 뇌가 소실되었습니다. 내 업데이트를 참조하십시오. :-) – PPvG

+0

환상적! 어레이 부품 수를 계산하는 방법을 알고 있습니까? 예를 들어, 'Pothole'의 num_child는 [] 배열이기 때문에 num_children을 제공하지 않지만 {} 객체이기 때문에 'Abandoned Building'을 계산합니다. –

0

질문이 애매합니다. 나는 당신이 필요로하는 것이 deepcopy와 유사한 것이라고 생각합니다. 다음은 딥 카피 기능입니다.

function deepCopy(p) { 
    var c = {}; 
    for (var i in p) { 
      if (typeof p[i] === 'object') { 
      c[i] = (p[i].constructor === Array)?[]:{}; 
      deepCopy(p[i],c[i]); 
      } 
    else { 
      c[i] = p[i]; 
      } 
    } 
    return c; 
    } 

응용 프로그램에 대해 위의 딥 카피 기능을 사용자 정의하십시오.

관련 문제