递归Javascript

递归Javascript,javascript,recursion,Javascript,Recursion,给出如下数据结构: var endpoints = { // top level "orders": { url: "/orders", // child "sub-level": { url: "/sublevel" } }, // users "users": { url: "/users", // child "an

给出如下数据结构:

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是键(例如,顶层中的“orders”或“users”),url是显而易见的,“parents”是我们向下钻取每一层时生成的某种堆栈

我在写这篇文章时经历了几次尝试,我遇到了变量作用域/通过引用传递属性与值以及其他各种奇怪的问题

数据结构也不是固定的,但需要包含这些信息。

下面是一个示例

   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);

以下代码将数据结构映射到
路由
对象列表中,每个对象都包含所属的
名称
url
父对象列表

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, [], []);

谢谢,将在周一进行测试,然后奖励答案!(不需要将
==
类型一起使用)为什么不需要?因为
typeof
的结果总是一个字符串,所以不需要进行类型检查<代码>=
很好,但并不总是必要的。==的优点是什么?我想===不做任何转换,而==做了。谢谢,我将在周一测试这个答案和另一个答案,并授予最优雅的:)