2011-07-10 15 views
1

JSONで再帰的に検索するか、JavaScriptオブジェクト

[{ 
    id:'our-purpose', 
    title:'Our Purpose', 
    slug:'/our-purpose', 
    backgroundImage:'images/bg-our-purpose.jpg', 
    showInNav:1 
    }, 
    { 
    id:'our-people', 
    title:'Our People', 
    slug:'/our-people', 
    backgroundImage:'images/bg-our-people.jpg', 
    showInNav:1, 
    subpages:[ 
     { 
     id:'attorneys', 
     title:'Attorneys', 
     slug:'/our-people/attorneys', 
     subpages:[ 
      { 
      id:'attorneys-cdb', 
      title:'Attorneys - Carla DeLoach Bryant', 
      slug:'/our-people/attorneys/carla' 
      }, 
      { 
      id:'attorneys-jad', 
      title:'Attorneys - Jordan A. DeLoach', 
      slug:'/our-people/attorneys/jordan' 
      }, 
      { 
      id:'attorneys-shh', 
      title:'Attorneys - Sarah H. Hayford', 
      slug:'/our-people/attorneys/sarah' 
      }, 
      { 
      id:'attorneys-jsp', 
      title:'Attorneys - Jason S. Palmisano', 
      slug:'/our-people/attorneys/jason' 
      }, 
      { 
      id:'attorneys-ldw', 
      title:'Attorneys - Lindsey DeLoach Wagner', 
      slug:'/our-people/attorneys/carla' 
      }, 
     ] 
     }, 
     { 
     id:'legal-support', 
     title:'Legal Support', 
     slug:'/our-people/legal-support', 
     subpages:[ 
      { 
      id:'legal-support-tb', 
      title:'Legal Support - Theolyn Brock', 
      slug:'/our-people/attorneys/theolyn' 
      }, 
      { 
      id:'legal-support-cd', 
      title:'Legal Support - Cheri DeFries', 
      slug:'/our-people/attorneys/cheri' 
      }, 
     ] 
     }, 
//...and so on 

あなたはjson[1].subpages[0].subpages[0]を行うことができることに気づくでしょうが、私はために起こっているのか深く知りません。これは私のデザイナークライアントが彼がクライアントのために構築しているAJAXサイトのために書かれています。私は他のものの中でのナビゲーションを生成しようとしているとのことができるようにする必要がありますよ:

A.ナビゲーション(<ul><li><a>...)一致するidのための

B.検索を構築するために再帰的にこれを解析します。 )この(これは再帰的ではありません)のような[とfor...inを無視し、その一例に過ぎのために

var matchId(id,json){ 
    for(x in json){ 
    if(json[x].id == id){ var theMatch = json[x]; break; } 
    } 
} 
+1

私はしないでくださいここに本当に質問があります。あなたはそれをどうやって行う必要があるか理解しているようです。 – icktoofay

+1

...?こんにちは、私はこの再帰的な方法を手がかりがありません –

答えて

2

このコードは、あなたのためのナビゲーションを構築します。

function buildNavForNode(node) { 
    var result = "<li id='" + node.id + "'><a href='" + node.slug + "'>" + node.title + "</a>"; 
    if(node.subpages == undefined) { 
    return result + "</li>"; 
    } else { 
    return result + buildNavForNodes(node.subpages) + "</li>"; 
    } 
} 


function buildNavForNodes(nodes) { 
    var result = "<ul>"; 
    var i = 0; 
    var len = nodes.length; 
    for(; i < len; i++) { 
    result += buildNavForNode(nodes[i]); 
    } 
    return result + "</ul>"; 
} 

は、ここであなたがそれを使用したい方法は次のとおりです。

var testData = [ 
    { 
    id:'our-purpose', 
    title:'Our Purpose', 
    slug:'/our-purpose', 
    backgroundImage:'images/bg-our-purpose.jpg', 
    showInNav:1 
    }, 
    { 
    id:'our-people', 
    title:'Our People', 
    slug:'/our-people', 
    backgroundImage:'images/bg-our-people.jpg', 
    showInNav:1, 
    subpages:[ 
     { 
     id:'attorneys', 
     title:'Attorneys', 
     slug:'/our-people/attorneys', 
     subpages:[ 
      { 
      id:'attorneys-cdb', 
      title:'Attorneys - Carla DeLoach Bryant', 
      slug:'/our-people/attorneys/carla' 
      }, 
      { 
      id:'attorneys-jad', 
      title:'Attorneys - Jordan A. DeLoach', 
      slug:'/our-people/attorneys/jordan' 
      }, 
      { 
      id:'attorneys-shh', 
      title:'Attorneys - Sarah H. Hayford', 
      slug:'/our-people/attorneys/sarah' 
      }, 
      { 
      id:'attorneys-jsp', 
      title:'Attorneys - Jason S. Palmisano', 
      slug:'/our-people/attorneys/jason' 
      }, 
      { 
      id:'attorneys-ldw', 
      title:'Attorneys - Lindsey DeLoach Wagner', 
      slug:'/our-people/attorneys/carla' 
      }, 
     ] 
     }, 
     { 
     id:'legal-support', 
     title:'Legal Support', 
     slug:'/our-people/legal-support', 
     subpages:[ 
      { 
      id:'legal-support-tb', 
      title:'Legal Support - Theolyn Brock', 
      slug:'/our-people/attorneys/theolyn' 
      }, 
      { 
      id:'legal-support-cd', 
      title:'Legal Support - Cheri DeFries', 
      slug:'/our-people/attorneys/cheri' 
      }, 
     ] 
     } 
    ] 
    } 
]; 

$(function(){ 
    htmlToInsert = buildNavForNodes(testData); 
    console.log(htmlToInsert); 
    $('body').html(htmlToInsert); 
}); 

あなたは再帰関数ではかなり容易にこれを行うことができますが、私は、これはうまくページのコレクションをどうするかを考え出すと、単一ページ自体を処理する間に職務の分離を描くと思います。

+0

私の完全なフィードはhttps://gist.github.com/8a9a80f8bccbb0a8136eです。コードはOurPeopleの後に停止し、そのサブページを一覧表示します –

+0

コードを更新しました。今すぐお試しください。 –

1

ここでは、JavaScriptと擬似コード)のいくつかの組み合わせで(スタートだ:

function createMenu(data) { 
    create UL 
    for each item in data { 
     create LI for item in UL 
     if the item has subpages { 
      append createMenu(item.subpages) to the LI 
     } 
    } 
    return UL 
} 

function findByID(data, id) { 
    for each item in data { 
     if(item.id==id) { 
      return the item 
     } 
     if item has subpages { 
      if findByID(item.subpages, id) is not null, return the result 
     } 
    } 
    return null; 
} 
+0

+1素敵な再帰。 – kobe

+0

「for each ... in」はMozillaのみであることに注意してください。 ECMAScriptの一部ではありません。 – user113716

+1

@パトリック:私はそれが有効なJavaScriptであることに気づいていませんでした。私はそれが擬似コードだと言った... – icktoofay

1
function matchId(id, json){ 
    if (!(json && "object" === typeof json)) { return; } 
    if (json.id === id) { return json; } 
    for (var x in json){ 
    if (Object.hasOwnProperty.call(json, x)) { 
     var result = matchId(id, json[x]); 
     if (result !== undefined) { return result; } 
    } 
    } 
} 
+0

@icktoofay、true、しかしこの関数は関係なく仕事。 http://www.squarefree.com/shellの 'JSON.stringify(matchId( 'foo'、[{x:{id: 'foo'、arr:[1、2、3]}]))'を実行する/shell.html私のために '{" id ":" foo "、" arr ":[1,2,3]}'を生成します –

+0

ああ、私は 'typeof [] ===" object "'を忘れていました。ごめんなさい。 – icktoofay

+0

@icktoofay、うん。 'typeof'は混乱します。 http://wiki.ecmascript.org/doku.php?id=harmony:typeof_null&s=typeof+harmonyしかしIIRCのどれもが配列を扱っていない。 –

1

JSONPathを試してみると、コードhereが見つかります。

+0

JSONPathは一致するオブジェクトの配列ではなく、一致するアイテムの配列を返すようですか?私はそれを間違って使用することができます。 –

+0

これは私が必要としていたものなので、アップアップされました。 –

0

私は最初のレベルのみたかったので、私はこのコードのNAVを生成:次に

$('#sidebar').append('<ul></ul>'); 

for(x in PAGES){ 
    if(PAGES[x].showInNav == 1){ 
    $('#sidebar > ul').append('<li data-id="'+PAGES[x].id+'"><a href="#!'+PAGES[x].slug+'">'+PAGES[x].title+'</a></li>'); 
    if(PAGES[x].subpages){ 
     $('#sidebar > ul > li:last').append('<ul></ul>'); 
     for(y in PAGES[x].subpages){ 
     $('#sidebar > ul > li:last > ul').append('<li data-id="'+PAGES[x].subpages[y].id+'"><a href="#!'+PAGES[x].subpages[y].slug+'">'+PAGES[x].subpages[y].title+'</a></li>'); 
     } 
    } 
    } 
} 

を、私はこのコードになってしまった再帰マッチ機能のために:

var matchKey = function(k,v,j){ 
    k = k || 'id'; //key 
    v = v || ''; //value 
    j = j || PAGES; //json 
    for(x in j){ 
    if(j[x][k] == v){ 
     return j[x]; 
    } 
    if(j[x].subpages){ 
     var result = matchKey(k,v,j[x].subpages); 
     if(result !== undefined){ 
     return result; 
     } 
    } 
    } 
} 
関連する問題