我有这样的地图:

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));

09-25 16:46
查看更多