开发者

How can I track the objects parents while searching in a multidimensional object in json?

My function to implement the search is below. The issue I have is I need to track what rows I have to go through to find the URL. I'm building a navigation "widget" and I need it to expand to the correct place based on the URL. Seeing as the URL could be N rows deep, I need a method to track the rows that it passed through.

E.G: row[1].tree.row[3].tree.row[0] , this way I know to expand the navigation for the second element, then the fourth element, then highlight the first element in that list.

The issue is with the rowNum = rowNum+"x"+x; that I pass back to the function. I think I might be overtired when I thought that would work, I didn't think it through.

Suggestions?

Thanks! I had another question out there about this same function, but this question is different. Is it bad form to submit an additional question?

    function lmIntra_LeftNavBuilder_findURL(url)
{

    return lmIntra_LeftNavBuilder_searchJson(jsonLNav.tree[0],url,null);
}//end findURL

function lmIntra_LeftNavBuilder_searchJson(tree,url,rowNum)
{
    if(rowNum == null)
    {
        rowNum="";
    }
    for(var x=0; x<=tree.rows.length-1;x++)
    {

    var cururl = "";
        if(typeof tree.rows[x] ==="undefined")
        {
            cururl="";
        }else
        {
            var cururl = tree.rows[x].url;
        }
        if(url == cururl )
        {
            //return tree.rows[x].title;
            return  rowNum + " treeDepth:"+tree.pos;
        }//end if
        else
            {

                if(typeof tree.rows[x]!= "undefined")
                {
                    if(typeof tree.rows[x].tree.rows != "undefined")
                    {
                    rowNum = rowNum+"x"+x;
                        var t = lmIntra_LeftNavBuilder_searchJson( tree.rows[x].tree,url,rowNum);
                        if (t) return t;
                    }//end if
                }//end if typeof tree.rows[x].tree!= "undefined"
            }//end else 

    }//end for


}//end searchJson

Here's a simpler json object. It's fully formed, it just doesn't have the depth. The full one is 38K characters, so I'll leave it out.

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:开发者_如何学Go{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"}},]}]}; 


If you really want to stick with the approach you have, though, I don't think it's really too far off. If I understand what you want, the biggest problem is that you need to do something like:

    if(url == cururl )
    {
        rowNum = rowNum+"x"+x;
        return  rowNum + " treeDepth:"+tree.pos;
    }


Presumably everything that exists in this tree maps to something that exists in the DOM, right? I think the most sensible option would be to stop traversing this object to find what you want, use a library like jQuery with a selector engine to select the node you want, and then use said library to traverse back up the DOM. Even traversing the DOM without a library might be easier for you.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜