2011-05-19 55 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