我试图区分不同的网址。我有一个if / else,但希望这可以在vanilla js中做得更好。请不要快递。
/product
/product/1
/product/1/customer
/product
/product/2
/product/2/customer
/customer
/customer/1
/customer/1/product
/customer
/customer/2
/customer/2/product
目前的策略:
if(request.url.indexOf('/product') != -1 && request.url.length == '/product'.length) {
} else if { // /product/:id
if(!request.params) request.params = {};
request.params.id = request.url.match(/^\/product\/([^\\/]+?)(?:\/(?=$))?$/i)[1];
} else { // 3rd case /product/1/customer
}
我认为我的if / else并没有解决上面提到的所有uri。请提出任何解决方案,以便我可以通过可重复使用的方式解决上述所有3个案例的不同网址,并从那里运行相应的查询。
答案 0 :(得分:0)
这是一个非常基本的例子,希望能让你走上正轨。您首先需要存储所需的所有URL以及要运行的相关功能。然后,当有新网址进入时,您需要将其与存储的网址进行比较,以查看是否存在匹配项。由于网址可能具有某些不同的值,因此您需要一种处理通配符的方法。
首先创建一个函数,将一个特定的url方案和相关的run函数添加到一个数组中。
var myUrls = [];
function addUrl(url, associatedFunc){
mrUrls.push({
func: associatedFunc,
parts: url.split('/').map(function(item){
return item.startsWith(':') ? null : item;
});
});
}
要添加新网址,您可以将:
放在网址的任何部分前面,这可能是狂野的。
addUlr('/product/:value/customer', doCustomerStuffFunc);
接下来,您需要一种将传入的网址请求与您的网址数组进行比较的方法。
function resolveUrl(url){
myUrls.forEach(function(item){
var pieces = url.split('/');
if(pieces.length === item.parts.length){
for(var i=0; i<pieces.length; i++){
// check if the piece is valid
if(item.parts[i] && pieces[i] !== item.parts[i]){
break;
}
// if there is an exact match run the function and return
if(i === pieces.length - 1){ return item.func(pieces); }
}
}
});
}
这将运行第一个遇到匹配的匹配函数,传入一个包含给定url中所有值的数组。
注意:这是未经测试的代码,写在我的头顶,旨在帮助您入门,而不是一个完整的解决方案。