2011-05-19 86 views
3

給定的數據結構如下:遞歸的Javascript

var endpoints = { 
    // top level 
    "orders": { 
     url: "/orders", 
     // child 
     "sub-level": { 
      url: "/sublevel" 
     } 
    }, 
    // users 
    "users": { 
     url: "/users", 
     // child 
     "another-sublevel": { 
      url: "/another-sublevel" 
     } 
    } 
} 

我怎麼能遞歸在這個生成每一次我遇到一個URL一個「路線」的對象?我還需要跟蹤父母的路線,所以:

var Route = function(name, url, parents) { 
} 

name是關鍵(例如,「訂單」或「用戶」在頂層)的網址是顯而易見的,「父母」是某種當我們向下鑽取每個級別時生成的堆棧。

我在寫這篇文章的時候遇到了一些問題,並且我遇到了可變範圍/傳遞屬性的問題,通過引用與值以及各種其他奇怪之處。

數據結構也不固定,但需要包含該信息。

+1

這是作業? – 2011-05-19 06:57:04

+0

什麼是路由對象? – ariel 2011-05-19 07:03:46

回答

2

下面是一個例子

function recurse(obj, parents){ 
     var prop; 
     parents = parents || []; 
     for(prop in obj){ 
      if(typeof(obj[prop]) === 'string' && prop === 'url'){ 
       //do something with url 
       console.log(obj[prop], parents.join('->')); 
      }else{ 
       parents.push(prop); 
       recurse(obj[prop], parents); 
       parents = []; 
      } 
     } 
    } 

    recurse(endpoints); 
+0

謝謝,將在星期一考試再頒獎! – Samuel 2011-05-19 08:02:16

+0

+1,看起來像中獎。 :) – 2011-05-19 08:29:36

+0

(使用'===''typeof'沒有必要。) – Rudie 2011-05-19 08:30:41

0

下面的代碼將所述數據結構映射到Route對象的列表,每個包含的parents歸屬nameurl和列表:

function mapRoutes(endpoints, parents, routes) { 
    var name, url; 

    for (name in endpoints) { 
    if (!endpoints.hasOwnProperty(name) || name === 'url') { 
     continue; 
    } 

    url = endpoints[name]['url']; 

    routes.push(new Route(name, url, parents)); 

    mapRoutes(endpoints[name], parents.concat([name]), routes); 
    } 

    return routes; 
} 

var routes = mapRoutes(endpoints, [], []); 
+0

謝謝,將在星期一測試這個答案和另一個,並授予最優雅:) – Samuel 2011-05-19 08:02:39