2011-03-23 6 views
1

나는 이것이 쉽지는 않을 것이라고 생각했지만, 꽤 두통으로 바뀌고 있습니다. 내 웹 서버에서 반환되는 다차원 JSON 개체가 있습니다. 상당히 깊은 탐색 창을 만들기 위해 파싱 중입니다. 이 객체를 검색 할 수 있어야하지만, 그 수단을 찾기 위해 비어 있습니다.다차원 json 객체에서 검색

개체도록 구성된다 : 트리 -> 행 [] => 트리 -> 행 [] => 트리 ... 등

각각의 나무는 많은 행이있을 수 있으며, 각 행은 트리를 가질 수

행 수준에는 몇 가지 변수가 있습니다. 검색하고 값 하나를 찾아야합니다. EX : if(tree.rows[x].tree.rows[y].url =="http://stackoverflow.com" return true;

어려운 점은, 전체 개체를 트래버스하는 방법을 모르겠다는 것입니다. 비록 내가 재귀 적으로 할지라도 나는 어떻게 모든 열을 계속 오르 내릴 수 있는지 모른다.

다음은 객체의 예 :

var jsonLNav = {itemClassName:"NodeLink",linkClassName:"NodeLinkTitle",linkHideClassName:"HideFromProd",navCategoryClassName:"NavCategory",onLoadJS:"",tree:[{pos:1,wid:"263a97c2-7cb9-470c-bf86-cadc28ae1323",pid:"1",rows:[{hide:0,title:"More IT Help",isNC:0,isMig:0,url:"http://vm-hsspdv-d09p/en-us/Help/Pages/ITHelp.aspx",isOL:0,tree:{pos:2,wid:"263a97c2-7cb9-470c-bf86-cadc28ae1323",pid:"3"}},{hide:0,title:"Office 2010",isNC:0,isMig:1,url:"http://office2010.lmig.com/Pages/Default.aspx",isOL:0,tree:{pos:2,wid:"263a97c2-7cb9-470c-bf86-cadc28ae1323",pid:"9"}},{hide:0,title:"E-mail Management",isNC:0,isMig:0,url:"http://vm-hsspdv-d09p/en-us/Help/EmailManagement/Pages/default.aspx",isOL:0,tree:{pos:2,wid:"8be66348-8da1-4e5c-90c5-0930d2f52d1a",pid:"123"}},]}]}; 

이 예제 조각 행의 자식 나무가없는, 않는 개체가 긴 수만 문자이며, 필요한 경우 내가 게시 할 수 있습니다. 내가 생각할 수있는

가장 좋은 코드는이 (안 테스트, 개념적으로 내가 부족 일)에 가까운 것 :

function findURL(url) 
{ 

alert(searchJson(jsonLNav.tree[0],url)); 
}//end findURL 

function searchJson(tree,url) 
{ 

for(var x=0; x<=tree.rows.length-1;x++) 
{ 
    if(url == tree.rows[x].url) 
    { 
     return tree.rows[x].title; 
    }//end if 
    else 
    { 
     searchJson(tree.rows[x].tree,url) 
    }//end else 
}//end for 


}//end searchJson 

감사합니다!

답변

2

검색 함수가 재귀 적으로 호출 할 때 반환 값에주의를 기울여야하며 검색 결과가 발견되었는지 여부를 어떻게 든 결정해야합니다. 함수가 아무것도 찾지 못하면 특별한 기능을 수행하지 않습니다. 반환 값이 정의되지 않았으므로 OK입니다.

else 
{ 
    var t = searchJson(tree.rows[x].tree,url); 
    if (t) return t; 
}//end else 

그런 식으로, URL이 (희망 비어) "제목"을 반환합니다 찾은 첫 번째 루프, 그리고 그 모든 "만약 (t에 대한 비어 있지 않은 값으로 스택을 전파한다) "문을 호출합니다.

+0

매우 빠르게, 감사합니다. 나는 그것을 시도하고있다. 나는 for 루프를 사용하여 문제가 발생했다. 내 오류 : "tree.rows 정의되지 않았습니다." 목록의 끝에서 재귀 적 메서드를 호출하고 행이 없다고 생각합니다. 나는 다른 타입의 체크를 던지고있다. – kevingreen

+0

@kevingreen 아마도 jsonLNav.tree [0] "이 아닌"jsonLNav.tree "로 함수를 호출해야 할 수도 있습니다 ... – Pointy

+0

나는 완전히 확신 할 수없는 이유로 json 객체를 생성하면서 상위 트리를 참조합니다 다른 모든 트리는 그렇지 않습니다. 불행히도 저는 시스템 외부에서 작성된 코드를 다루므로, 그 이유를 파고 들지 못합니다. 유형이 제 테스트에서 작동하는 것 같습니다. 경우. – kevingreen

관련 문제