Javascript 从url字符串读取参数并执行适当的函数

Javascript 从url字符串读取参数并执行适当的函数,javascript,Javascript,我在函数runUrl中为RestfulAPI创建了某种类型的“路由系统”-在输入时,我放置了包含一些参数(ID值)的url,我想在routes数组中找到这个url,用这个参数执行为该路由指定的函数,并将结果作为runUrl结果返回 函数runUrl(url){ 返回项目('f505ecfb74','5e735f505c');//硬编码模型 //问题:这个函数应该是什么样子? } 让路线=[ [汽车,汽车], ['/companys/:companyId/cars/:carId/projects

我在函数
runUrl
中为RestfulAPI创建了某种类型的“路由系统”-在输入时,我放置了包含一些参数(ID值)的url,我想在
routes
数组中找到这个url,用这个参数执行为该路由指定的函数,并将结果作为
runUrl
结果返回

函数runUrl(url){
返回项目('f505ecfb74','5e735f505c');//硬编码模型
//问题:这个函数应该是什么样子?
}
让路线=[
[汽车,汽车],
['/companys/:companyId/cars/:carId/projects',projects],
['/companys/:companyId/room/:roomId',rooms],
//... 
];
//为给定url执行的函数列表
函数cars(){return[“car1”,“car2”];}
函数项目(companyId,carId){return[`proj-${companyId}`,`proj-${carId}`];}
多功能厅(companyId,roomId){return`room-${companyId}-room-${roomId}}
// ... (更多功能)
//试验

log(runUrl('/companys/f505ecfb74/cars/5e735f505c/projects')我认为您不能使用match方法,因为它并不意味着两个字符串之间相等,但我认为我找到了解决您问题的优雅解决方案,也许它会帮助您:

let routes=[
[汽车,汽车],
['/companys/:companyId/cars/:carId/projects',projects],
['/companys/:companyId/room/:roomId',rooms],
];
函数runUrl(url){
让arrull=url.split('/')//它将在/
让route=routes.find(r=>arrUrl.length==r[0]。split('/').length);//它的长度应该相等
如果(路线){
让params=arrull.filter(p=>p&&p.match(//\d+/)//它将只剪切ID(带数字的字符串)
返回路线[1](参数);
}
返回null;
}
//为给定url执行的函数列表
函数cars(){
返回[“car1”、“car2”];
}
函数项目(数组){
返回[`proj-${array[0]}`、`proj-${array[1]}`];
}
多功能厅(阵列){
返回`company-${array[0]}-room-${array[1]}`;
}
// ... (更多功能)
//试验
log(runUrl('/cars'))
log(runUrl('/companys/f505ecfb74/cars/5e735f505c/projects'))

console.log(runUrl('/companys/f505ecfb74/room/5e735f505c'))
我认为您不能使用match方法,因为它并不意味着两个字符串之间相等,但我认为我找到了一个解决问题的优雅方法,也许它会帮助您:

let routes=[
[汽车,汽车],
['/companys/:companyId/cars/:carId/projects',projects],
['/companys/:companyId/room/:roomId',rooms],
];
函数runUrl(url){
让arrull=url.split('/')//它将在/
让route=routes.find(r=>arrUrl.length==r[0]。split('/').length);//它的长度应该相等
如果(路线){
让params=arrull.filter(p=>p&&p.match(//\d+/)//它将只剪切ID(带数字的字符串)
返回路线[1](参数);
}
返回null;
}
//为给定url执行的函数列表
函数cars(){
返回[“car1”、“car2”];
}
函数项目(数组){
返回[`proj-${array[0]}`、`proj-${array[1]}`];
}
多功能厅(阵列){
返回`company-${array[0]}-room-${array[1]}`;
}
// ... (更多功能)
//试验
log(runUrl('/cars'))
log(runUrl('/companys/f505ecfb74/cars/5e735f505c/projects'))

log(runUrl('/companys/f505ecfb74/room/5e735f505c'))
这是我的建议,类似于但使用regexp来检测参数

函数runUrl(url){
让结果=未定义;
设u=url.split(“/”);
routes.find(([route,func])=>{
设r=路线分割(“/”);
如果(r.length==u.length和r.every((el,i)=>/^:/.test(el)| | el==u[i])){
设params=u.filter((el,i)=>/^:/.test(r[i]);
结果=函数调用(此,…参数);
返回true;
}            
返回false;
})  
返回结果;
}
// -----------
//试验
// -----------
让路线=[
[汽车,汽车],
['/companys/:companyId/cars/:carId/projects',projects],
['/companys/:companyId/room/:roomId',rooms],
//... 
];
函数cars(){return[“car1”,“car2”];}
函数项目(companyId,carId){return[`proj-${companyId}`,`proj-${carId}`];}
多功能厅(companyId,roomId){return`room-${companyId}-room-${roomId}`;}
//试验
log(runUrl('/companys/f505ecfb74/cars/5e735f505c/projects');
log(runUrl('/cars'))

log(runUrl('/companys/ABC123/room/DEF5678')
这是我的建议,类似于但使用regexp来检测参数

函数runUrl(url){
让结果=未定义;
设u=url.split(“/”);
routes.find(([route,func])=>{
设r=路线分割(“/”);
如果(r.length==u.length和r.every((el,i)=>/^:/.test(el)| | el==u[i])){
设params=u.filter((el,i)=>/^:/.test(r[i]);
结果=函数调用(此,…参数);
返回true;
}            
返回false;
})  
返回结果;
}
// -----------
//试验
// -----------
让路线=[
[汽车,汽车],
['/companys/:companyId/cars/:carId/projects',projects],
['/companys/:companyId/room/:roomId',rooms],
//... 
];
函数cars(){return[“car1”,“car2”];}
函数项目(companyId,carId){return[`proj-${companyId}`,`proj-${carId}`];}
多功能厅(companyId,roomId){return`room-${companyId}-room-${roomId}`;}
//试验
log(runUrl('/companys/f505ecfb74/cars/5e735f505c/projects');
log(runUrl('/cars'))

log(runUrl('/companys/ABC123/room/DEF5678'))
路由是不可更改的还是可以修改它?期望给定给它的参数是正则表达式。没有一个r[0]值是常规值expressions@CertainPerformance相当不可更改-但如果您有一些建议要更改-请随意填充以显示它,我会将正则表达式放在其中,而不是