2011-03-23 76 views
1

我認爲這會很容易,但它變得非常頭疼。我有一個多維的JSON對象從我的web服務器返回。我解析它來構建一個相當深的導航窗格。我需要能夠搜索這個對象,但我爲了這個手段而空白。在多維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

當你的搜索函數遞歸調用它時,它必須注意返回的值,並以某種方式確定它是否被找到。當你的函數什麼也沒有發現時,它並沒有做任何特殊的事情,我想這是可以的,因爲返回值是未定義的。

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

這樣一來,即認定該URL將返回(希望非空)「稱號」的第一環,而將傳播到堆棧爲所有的「如果(T一非空值)「調用堆棧中的語句。

+0

很快,謝謝。我正在嘗試一下,我在for循環中遇到了一個問題。我的錯誤是:「tree.rows是未定義的」。我認爲它是在列表末尾調用遞歸方法,並且沒有行。我在其他類型的檢查中折騰。 – kevingreen 2011-03-23 21:57:02

+0

@kevingreen也許你應該最初使用「jsonLNav.tree」而不是jsonLNav.tree [0]「調用函數... – Pointy 2011-03-23 21:59:18

+0

由於我不完全確定的原因,json對象被創建時引用了父樹數字爲[0],其他所有樹都沒有,不幸的是我正在處理寫在系統外部的代碼,所以目前我無法深入瞭解它的原因。typeof似乎在我的測試中工作情況。 – kevingreen 2011-03-23 22:03:07