【问题标题】:Searching in a multidimensional json object在多维 json 对象中搜索
【发布时间】:2011-03-23 21:46:05
【问题描述】:

我以为这会很容易,但它变得相当令人头疼。我有一个从我的网络服务器返回的多维 JSON 对象。我正在解析它以构建一个相当深的导航窗格。我需要能够搜索这个对象,但我对方法一无所知。

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

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

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

谢谢!

【问题讨论】:

    标签: javascript json web


    【解决方案1】:

    当你的搜索函数递归调用自身时,它必须注意返回值,并以某种方式确定它是否找到它。当你的函数什么也没找到时,它不会做任何特别的事情,我想这没问题,因为返回值是未定义的。

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

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

    【讨论】:

    • 很快,谢谢。我正在尝试一下,我在 for 循环中遇到了问题。我的错误是:“tree.rows 未定义”。我认为它在列表末尾调用递归方法并且没有行。我在 else 中加入了 typeof 检查。
    • @kevingreen 也许你最初应该使用 "jsonLNav.tree" 而不是 jsonLNav.tree[0]" 来调用函数...
    • 由于我不完全确定的原因,正在创建父树的 json 对象用数字 [0] 引用。其他所有树都没有。不幸的是,我正在处理在我的系统之外编写的代码,所以目前我无法深入研究为什么会这样。 typeof 似乎在我的测试用例中有效。
    • 我把这个扔进去了,我要拿回标题了。 if(typeof tree.rows[x].tree.rows != "undefined") { var t = searchJson(tree.rows[x].tree,url);如果 (t) 返回 t; }
    • 还有一个问题,请帮忙。您将如何跟踪找到 URL 的行?我需要知道它是 row0,row1,row3 才能访问我的 URL。谢谢
    猜你喜欢
    • 2016-05-11
    • 2012-07-28
    • 1970-01-01
    • 2012-09-09
    • 2021-04-01
    • 1970-01-01
    • 2020-02-23
    • 2020-06-24
    • 2015-09-24
    相关资源
    最近更新 更多