2017-05-27 5 views
0

私はオブジェクトトラバーサルに関する質問を解決しようとしています。オブジェクトがかなり大きくなる可能性があるので、再帰が必要だと思います。一方向に進むプロパティに基づいてオブジェクトを横断し、別の方向に進む別の方向に向かうオブジェクトを横断しながら、各ルートに対して別々の配列結果を作成したいと考えています。交差点を通り、多くの道を行く通りがあるかもしれないので、拡大縮小が必要です。私はルートを保存するために、グローバル変数を使用するか、引数としてルートを運ぶために必要がある場合は、それらをプッシュしすぎてわからないJavascript jQueryオブジェクトのトラバーサル

Traverse the From -> To 
[ 
{ “block”:”West Block”, “from”:”Ham St”, “to”:”Union St” }, 
{ “block”:”West Block”, “from”:”Union St”, “to”:”Graph St” }, 
{ “block”:”South Block”, “from”:”Graph St”, “to”:”Back St” }, 
{ “block”:”South Block”, “from”:”Graph St”, “to”:”Rory St” }, 
{ “block”:”South Block”, “from”:”Rory St”, “to”:”Friend St” }, 
{ “block”:”South Block”, “from”:”Back St”, “to”:”Front St” }, 
{ “block”:”South Block”, “from”:”Friend St”, “to”:”Foe St” } 
] 

… 
Result would look like: 
[Ham St, Union St, Graph St, Back St, Back St, Front St], 
[Ham St, Union St, Graph St, Rory St, Friend St, Foe St] 


And another but going the opposite way. 
Traverse the To -> From 
[ 
{ “block”:”West Block”, “from”:”Bark St”, “to”:”Ham St” }, 
{ “block”:”West Block”, “from”:”Upper St”, “to”:”Bark St” }, 
{ “block”:”West Block”, “from”:”Bacon St”, “to”:”Upper St” }, 
{ “block”:”West Block”, “from”:”Heath St”, “to”:”Bacon St” }, 
{ “block”:”West Block”, “from”:”East St”, “to”:”Heath St” }, 
{ “block”:”North Block”, “from”:”Wood St”, “to”:”Bark St” }, 
{ “block”:”North Block”, “from”:”Win St”, “to”:”Wood St” }, 
{ “block”:”North Block”, “from”:”High St”, “to”:”Win St” }, 
{ “block”:”North Block”, “from”:”Stone St”, “to”:”High St” }, 
] 

… 

Result would look like. 
[Ham St, Bark St, Upper St, Bacon St, Heath St, East St], 
[Ham St, Bark St, Wood St, Win St, High St, Stone St] 

:結果は...

例(ルート)多くのルートかもしれませんグローバル配列に?

var stoproutes = []; 
var stops = 6; 
function walkObj(routes,stop,route,n){ 

    var arr = $.grep(routes,function(r){ return r.to === stop['to'] || r.from === stop['from'] }); 

    $.each(arr,function(i,v){ 
     // figure out if its from -> to, or to -> from 
     if(v['from'] === stop['from']){ 
      // from -> to, outbound 
      route[i].push(v['to']); 

     } else { 
      // from <- to, inbound 
      route[i].push(v['from']); 
     } 
     if(n<stops){ 
      walkObj(routes,v,route,n+1); 
     } else { 
      stoproutes.push(route); 
     } 

    }); 

} 

walkObj(routes,'Ham St',[],0); 
+0

ツリーは保存の良い方法wouldntのそのような場合は? –

+0

私はそれも良いアプローチだと思います。私は以前それをしていない。どのようにそれを開始するためのアドバイス?実際に、私はまず木について考えましたが、それをどうやって作るのかは分かりませんでした。私は紙でそれを描くことができますが、それをコード化する方法について考える必要があります。 – Paul

答えて

0

ツリーを作成することをお勧めします。あなたの配列をutに変換するにはしばらく時間を要しますが、もしそれを使って作業すれば価値があります。したがって、繰り返しを実行することでツリーを作成することができます:

var array=[ 
    { “block”:”West Block”, “from”:”Ham St”, “to”:”Union St” }, 
    { “block”:”West Block”, “from”:”Union St”, “to”:”Graph St” }, 
    { “block”:”South Block”, “from”:”Graph St”, “to”:”Back St” }, 
    { “block”:”South Block”, “from”:”Graph St”, “to”:”Rory St” }, 
    { “block”:”South Block”, “from”:”Rory St”, “to”:”Friend St” }, 
    { “block”:”South Block”, “from”:”Back St”, “to”:”Front St” }, 
    { “block”:”South Block”, “from”:”Friend St”, “to”:”Foe St” } 
]; 

var streets={} 

array.forEach(function(street){ 
    if(streets[street.from]){ 
    streets[street.from].push(street.to); 
    }else{ 
    streets[street.from]=[street.to]; 
    } 
}); 

これで、ユニークな通りとその関連ストリート名を持つオブジェクトが配列に格納されました。今すぐこのようなルートを得ることができます

streets[streets["Graph St"][0]][0] 

これは、最初に関連付けられた通りの最初の関連する通りを返します。

function findRoute(start,end){ 
    return start.reduce(function(routes,street){ 
    if(street===end) return routes.concat([[end]]); 
     if(streets[street]){ 
     return routes.concat(findRoute(streets[street],end).map(function(route){ 
      route.splice(0,0,street); 
      return route; 
     })); 
     } 
    return routes; 
    },[]); 
} 

var result=findRoute(streets["Graph St"],"Friend St"); 

console.log(result); 

をそれとも、その1から行くすべての通りを検索する場合:我々は2つの通りの間のルートを検索したい場合は、私たちが行うことができます

function findAll(start){ 
    return start.reduce(function(routes,street){ 
    if(streets[street]){ 
     return routes.concat(findAll(streets[street]).map(function(route){ 
     route.splice(0,0,street); 
     return route; 
     })); 
    } 
    routes.push([street]); 
    return routes; 
},[]); 
} 

result=findAll(streets["Graph St"]); 

console.log(result); 
+0

近くに見えますが、番号に基づいてすべてのルートを検索したいのですが?ハム・セントから3つの通りのように? – Paul

+0

私はこれのために、フィドル、https://jsfiddle.net/6gbm2pot/4/を作成しました。私の問題は私がルートをたどりたいということです。ルートが交差点(Graph St)に出くわしたら、両方のルートをたどり、起点から5番目の通りで止まります。 – Paul

+0

@Paulその後、endをundefinedに設定し、通りが終了したら([未定義ではなく]) –

関連する問題