Javascript jQuery对象遍历
我试图解决一个关于对象遍历的问题。我想我需要递归,因为对象可能相当大。我希望基于一个属性沿一个方向遍历一个对象,然后再沿另一个方向遍历另一个对象,同时为每个路由创建单独的数组结果。它需要扩大规模,因为可能会有一条街道撞到十字路口,并向许多方向移动。结果可能是许多路线 示例(路线): 我不太确定是否需要使用全局变量来存储路由或将路由作为参数传递到全局数组Javascript jQuery对象遍历,javascript,jquery,Javascript,Jquery,我试图解决一个关于对象遍历的问题。我想我需要递归,因为对象可能相当大。我希望基于一个属性沿一个方向遍历一个对象,然后再沿另一个方向遍历另一个对象,同时为每个路由创建单独的数组结果。它需要扩大规模,因为可能会有一条街道撞到十字路口,并向许多方向移动。结果可能是许多路线 示例(路线): 我不太确定是否需要使用全局变量来存储路由或将路由作为参数传递到全局数组 var stoproutes = []; var stops = 6; function walkObj(routes,stop,route,n
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);
var stoproutes=[];
var=6;
功能walkObj(路线、车站、路线、n){
var arr=$.grep(路由,函数(r){return r.to===stop['to']| | r.from===stop['from']});
$。每个(arr,功能(i,v){
//确定它是从->到,还是到->从
如果(v['from']==停止['from']){
//从->到,出站
路线[i]。推(v['to']);
}否则{
//从开始,我建议您创建一个树。将数组转换为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);
或者如果你想找到从那条街道开始的所有街道:
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);
对于这种情况,树不是一种更好的存储方式吗?我认为这也是一种很好的方法。我以前没有这样做过。关于如何启动它有什么建议吗?事实上,我第一次想到一棵树,但不知道如何制作。我可以在纸上画它,但需要考虑如何编码。看起来很接近,如果我想找到基于nu的所有路由呢mber?如火腿街的3条街道?我为此创建了一个提琴。我的问题是,我想沿着路线走,如果路线遇到交叉点(图st),它会沿着两条路线走,并在起点的第5条街道停下来。@Paul然后将end设置为undefined,如果街道结束(而不是undefined),则返回[]@Paul抱歉,我的代码中有一个错误。请看一下它现在的工作情况……Jonas,谢谢你检查。好吧,现在我正在尝试将这些概念应用到我的真实数据中。我似乎无法得到我期望的结果。两件事,插入起点和插入可能的站点数。但是我得到了一些重复的结果如果没有看到真正的终点等,我想知道是否最好只是得到一个简单的终点列表?请参阅jsbin中的注释
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);