2011-03-23 89 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