我有这样的地图:
const urlPaths = {
"Signature": "signature/(signatureId)",
"Rule": "signature/(signatureId)/rule/(ruleId)",
};
然后,我的API中就有一些数据,例如:
aId: {
signatureId: "999"
}
要么
aId: {
signatureId: "123",
ruleId: "456"
}
我希望能够使用该映射,以便向我返回签名或规则的网址,例如:
"signature/999"
或"signature/123/rule/456"
我遇到过正则表达式替换,但是想知道,在这种情况下我可以实际使用吗?
function createUrl(url, regex, aId){
url.replace(regex,(id) => aId[id])
}
不知道它是否可能/如何处理,还是我需要其他东西?
任何想法表示赞赏。
谢谢。
最佳答案
由于要替换的模式与属性名称匹配,因此不确定是否必须严格使用RegExp
。您可以执行以下操作:
const urlPaths = {
"Signature": "signature/(signatureId)",
"Rule": "signature/(signatureId)/rule/(ruleId)",
};
const aId1 = {
signatureId: "999"
};
const aId2 = {
signatureId: "123",
ruleId: "456"
};
const createUrl = (url, aId) => {
let newUrl = url;
Object.entries(aId).forEach(([key, value]) => {
newUrl = newUrl.replace(`(${key})`, value);
});
return newUrl;
}
console.log(createUrl(urlPaths.Signature, aId1));
console.log(createUrl(urlPaths.Rule, aId2));
如果您确实想使用
RegExp
,下面是一个示例,说明如何使用const urlPaths = {
"Signature": "signature/(signatureId)",
"Rule": "signature/(signatureId)/rule/(ruleId)",
};
const aId1 = {
signatureId: "999"
};
const aId2 = {
signatureId: "123",
ruleId: "456"
};
const createUrlRegExp = (url, regexs, aId) => {
let newUrl = url;
const replacer = match => aId[match.slice(1, -1)]; // get rid of parentheses around match
regexs.forEach(regex => {
newUrl = newUrl.replace(regex, replacer)
});
return newUrl;
};
console.log(createUrlRegExp(urlPaths.Signature, [/\(signatureId\)/], aId1));
console.log(createUrlRegExp(urlPaths.Rule, [/\(signatureId\)/, /\(ruleId\)/], aId2));