2016-07-04 5 views
0

を構築するためにオブジェクトをリンク:私は何をしようとしているJavascriptを再帰的に私はこのように見える二つのオブジェクト持ってオブジェクトツリー

var cache = { 
'39' : { id : 39, name : 'Tom' }, 
'40' : { id : 40, name : 'David'}, 
'41' : { id : 41, name : 'Daniel'}, 
'356': { id :356, grp: 'ROM', fee: '$35'} 
} 

var tree = { 
person : { id : 39 }, 
memberships : { id : 356 }, 
} 

を引数としてtreeオブジェクトを取る再帰関数を書くことですcacheオブジェクト内の対応するオブジェクトを参照/リンクするデータ構造を生成します。だから最後に私はこのようにユーザー 'Tom'にアクセスできる必要があります:tree.person.name

私は2つの理由で再帰を使用しています:それは、ユーザの入力とによって異なり

  • (それが入れ子になっている)私の実際のtreeオブジェクトは、私がここに示されているものよりも方法がより複雑である

    1. var traverse = function (jsonObj) { 
          if(typeof jsonObj == "object") { 
           if(cache[jsonObj.id]){ 
            jsonObj = Ocache[jsonObj.id]; 
      
           } 
           $.each(jsonObj, function(k, v) { 
           traverse(v); 
           }); 
          } 
          else { 
           // jsonObj is a number or string 
          } 
          } 
      
      :私はリンク/参照を行うには、この再帰関数を書いた

  • ツリーの深さは不明です

    その後、私は

    traverse(tree); 
    

    のような関数を呼び出すが、私は私のtreeオブジェクトを参照するためにデバッガを使用する場合、何も変わっていない:treeは前と同じです。キャッシュオブジェクト内でこのオブジェクトと参照オブジェクト/リンクオブジェクトをどのようにして達成できますか?

    +0

    希望の結果を投稿できますか? '$ .each()'もjqueryです。 –

    +0

    'Ocache'とは何ですか? – melpomene

    答えて

    1

    コードの主な問題はjsonObj = cache[jsonObj.id]です:jsonObj、ローカル変数であるtraverseを上書きしていますが、この特定の関数呼び出しの外には何の影響もありません。

    ネストされたツリーオブジェクト自体に変更を加えるために、あなたは親オブジェクトと現在のキーを追跡する必要があります。

    var cache = { 
     
        '39' : { id: 39, name: 'Tom' }, 
     
        '40' : { id: 40, name: 'David'}, 
     
        '41' : { id: 41, name: 'Daniel'}, 
     
        '356': { id: 356, grp: 'ROM', fee: '$35'} 
     
    }; 
     
    
     
    var tree = { 
     
        person: { id: 39 }, 
     
        memberships: { id: 356 }, 
     
    }; 
     
    
     
    function traverse(obj) { 
     
        for (var k in obj) { 
     
         var v = obj[k]; 
     
         if (!v || typeof v !== 'object') continue; 
     
         if (cache[v.id]) { 
     
          obj[k] = cache[v.id]; 
     
         } else { 
     
          traverse(v); 
     
         } 
     
        } 
     
    } 
     
    
     
    traverse(tree); 
     
    
     
    console.log(tree);

    typeof nullので、私は!vチェックを追加しましたobjectですが、nullに再帰したくありません。

    idのないオブジェクトはid: 'undefined'と扱われませんでした(そうしたくない場合は、if (cache[v.id])行に追加のチェックを追加してください)。

    +0

    お返事ありがとうございました。これは、指定されたツリーオブジェクトに対して完全に機能します。しかし、私は、 'tree'オブジェクトにオブジェクトの配列があることに気付きました。次のように var tree = { 人:{id:39}、 メンバーシップ:[{id:356}、{id:370}]、 連絡先:{{id:150}、{id :171}]} }; これらのオブジェクトに対して上記のソリューションを拡張するにはどうすればよいですか? – Rahal

    関連する問題