在多维json对象中搜索

时间:2011-03-23 21:46:05

标签: javascript json web

我认为这很容易,但它变得非常头疼。我有一个从我的网络服务器返回的多维JSON对象。我正在解析它以构建一个相当深的导航窗格。我需要能够搜索到这个对象,但是我的方法空白了。

对象的结构如下:tree-> rows [] => tree-> rows [] => tree ...

每棵树可以有很多行,每行可以有一棵树等。

在行级别有一些变量,我需要搜索并找到一个值。 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

谢谢!

1 个答案:

答案 0 :(得分:2)

当您的搜索函数以递归方式调用自身时,它必须注意返回的值,并以某种方式确定是否找到它。当你的函数什么都没找到时,它没有做任何特殊的事情,我认为这是正常的,因为返回值将是未定义的。

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

这样,找到url的第一个循环将返回(希望非空)“title”,并且它将作为所有“if(t)”语句的非空值传播到堆栈中。调用堆栈。