I am building a JS router and would like to have some help doing it. It will work like so:
A list of routes is given with a URL pattern attached in each one.
[
{ url : "/home"},
{ url : "/user/:id"}
]
I want a function that will find the appropriate pattern when we pass it a route URL and will return the object of parameters:
getRouteParams("/home"); // {params: {}}
getRouteParams("/user/42"); // {params: {id: "42"}}
getRouteParams("/contact"); // null
I tried to do something with some parts of code I have found on the web and here is what I ended up with:
var routes = [
{ url : "/home"},
{ url : "/user/:id"}
];
function getRouteParams(url) {
var argsVal = null;
var x = 0;
var result = {};
for(; routes.length; x++){
var routeMatcher = new RegExp(routes[x].url.replace(/(:\w+)/g, '([\\w-]+)'));
argsVal = url.match(routeMatcher);
if(argsVal) {
argsVal.shift();
result.params = makeObj(argsVal, routes[x].url);
break;
}
}
return result;
function makeObj(vals, url) {
var routeParts = url.split('/');
var options = {};
for(var i=0, j=0; i<routeParts.length; i++) {
if(routeParts[i].indexOf(":") !== -1) {
options[routeParts[i].slice(1)] = vals[j++];
}
}
return options;
}
}
console.log(getRouteParams("/home")); // {params: {}}
console.log(getRouteParams("/user/42")); // {params: {id: "42"}}
console.log(getRouteParams("/contact")); // null)
This is a bit more sophisticated but the idea is there. Could someone help me improve on what I did?