我想用RegEx或其他任何方法(如果有更好的方法)解决一个问题。我已经尝试了几种方法来实现这一目标,但没有任何效果。
我有一个带有端点的数组:
const endpoints = [
{
id: 1,
url: "/api/items/:itemId"
},
{
id: 2,
url: "/api/users/:userName/delete"
},
{
id: 3,
url: "/api/users/:userName/edit"
}
];
和请求网址:
const url = "/api/users/max/edit";
现在我想要的是一个具有如下功能的功能:
const rewrite = (url, endpoints) => {
// What is the best way to achieve the following return value:
return {
endpointId: 3,
values: {
userName: "max"
}
};
};
说明:函数应为URL找到合适的端点。端点URL中以冒号开头的所有部分都不是静态的,而应替换为请求URL中的值。在这种情况下,:userName
应该替换为max
。
我从事Web开发已有一段时间了,但老实说,我几乎不知道如何解决此类问题。
答案 0 :(得分:2)
const rewrite = (url, endpoints) => {
var doubledArray = Array.prototype.map.call(endpoints, function(el) {
return {
id: el.id,
url: el.url.split('/')
};
});
var parts = url.split('/');
var i = 0;
parts.forEach(function(element) {
doubledArray = doubledArray.filter(el => (element == el.url[i] || el.url[i].startsWith(':')));
i++;
});
return {
endpointId: doubledArray[0].id,
values: {
[`${doubledArray[0].url.filter(el => el.startsWith(':'))[0].substring(1)}`]: parts[doubledArray[0].url.findIndex(function (el) { return el.startsWith(':'); } )],
}
};
};
答案 1 :(得分:1)
您可以遍历endpoints
,将每个.url
放入RegExp来测试该网址。
找到匹配的对象时,只需提取所需的部分并组成具有属性名称的对象即可。
<script>
const myEndpoints = [
{
id: 1,
url: "/api/items/:itemId"
},
{
id: 2,
url: "/api/users/:userName/delete"
},
{
id: 3,
url: "/api/users/:userName/edit"
}
];
const myUrl = "/api/users/nermal/edit";
const rewrite = (url, endpoints) => {
for (let i = 0; i < endpoints.length; i++) {
var rep = new RegExp(":(\\w+)", "m");
var propName = rep.exec(endpoints[i].url);
var reu = new RegExp(endpoints[i].url.replace(propName[0], "(.*)"));
var a = reu.exec(url);
if (a !== null) {
var x = new Object;
x["endpointId"] = endpoints[i].id;
var y = new Object;
y[propName[1]] = a[1];
x["values"] = y;
return x;
}
}
return null;
};
var q = rewrite(myUrl, myEndpoints);
console.log(q);
console.log(q.values);
</script>
输出:
对象{的EndpointId:3,值:{...}}
对象{userName:“ nermal”}