我正在一个解决方案中开发一个通用函数,它将/endpoint/{item.id}/disable/{item.name}
替换为/endpoint/123/disable/lorem
,我将函数传递给URL和item。
该项目是一个包含密钥id
和name
的对象。
查找结构为{item.KEY}
的项目并将其替换为item.KEY
的最佳方法是什么?
答案 0 :(得分:2)
解决此问题的最佳方法是传递函数来处理正则表达式。 我修改了您的参数以使映射更容易 - 我确定您可以在必要时自行更改
var url = '/endpoint/{id}/disable/{name}'; //I modified your parameters
var definition = { id: 123, name: 'lorem' };
url = url.replace(/{([^}]*)}/g, function (prop) {
var key = prop.substr(1, prop.length - 2);
if (definition[key])
return encodeURIComponent(definition[key]);
else
throw new Error('missing required property "' + key + '" in property collection');
});
//alert(url);
答案 1 :(得分:1)
如果您不想使用eval,可以使用类似this的内容:
var item = {
id: 123,
KEY: "lorem"
};
function pick(o, s) {
s = s.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties
s = s.replace(/^\./, ''); // strip a leading dot
var a = s.split('.');
for (var i = 0, n = a.length; i < n; ++i) {
var k = a[i];
if (k in o) {
o = o[k];
} else {
return;
}
}
return o;
}
然后
str.replace(/{.*?}/g, function(match){ // match {...}
var path = match.substring(1,match.length-1); // get rid of brackets.
return pick(scope, path); //get value and replace it in string.
});