递归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
的结果总是一个字符串,所以不需要进行类型检查<代码>=
很好,但并不总是必要的。==的优点是什么?我想===不做任何转换,而==做了。谢谢,我将在周一测试这个答案和另一个答案,并授予最优雅的:)