Поиск в многомерном объекте json - PullRequest
1 голос
/ 24 марта 2011

Я думал, что это будет легко, но это превращается в головную боль.У меня есть многомерный объект JSON, возвращаемый с моего веб-сервера.Я разбираю его, чтобы построить довольно глубокую панель навигации.Мне нужно иметь возможность искать этот объект, но я не могу найти средства.

Объект структурирован следующим образом: дерево-> строки [] => дерево-> строки [] => дерево…

В каждом дереве может быть много строк, и каждая строка может иметьдерево и т. д.

На уровне строк есть несколько переменных, мне нужно найти и найти значение одной.Пример: 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 Ответ

2 голосов
/ 24 марта 2011

Когда ваша поисковая функция вызывает себя рекурсивно, она должна обратить внимание на возвращаемое значение и каким-то образом определить, найдено оно или нет.Ваша функция не делает ничего особенного, когда ничего не находит, что, я полагаю, в порядке, потому что возвращаемое значение будет неопределенным.

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

Таким образом, первый цикл, который находит URL, вернетнепустое) "title", и это будет распространяться вверх по стеку как непустое значение для всех операторов "if (t)" в стеке вызовов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...