我正在尝试使用对象中可比较的jSON属性替换字符串中的值。
var value = "/sessions/:sessionId/events/:id";
var result = replace(value, { sessionId : 1 , id : 23 });
// result : "/sessions/1/events/23"
console.log(result);
是否可以使用JavaScript(我确定是)?不确定最有效的方法,以及当模板字符串中的所有值都不匹配时如何处理它。
提前致谢。
var url = function (template, parameters) {
var extra = [];
for (param in parameters) {
if (value.indexOf(param) < 0) {
extra.push(param + '=' + parameters[param]);
}
}
var result = template.replace(/:(\w+)/g, function (substring, match) {
var routeValue = parameters[match];
if (!routeValue) {
throw "missing route value for " + match + ' in "' + template +'"';
}
return routeValue;
});
if (result.indexOf("/:") > 0) {
throw "not all route values were matched";
}
return (extra.length === 0) ? result : result + "?" + extra.join("&");
};
var value = "/sessions/:sessionId/events/:id";
var data = {
sessionId: 1,
id: 23,
term: "butter"
};
// result : /sessions/1/events/21?term=butter
console.log(url(value, data));
答案 0 :(得分:6)
正则表达式在这里工作得很好。
var value = "/sessions/:sessionId/events/:id";
var obj = { sessionId : 1 , id : 23 };
var result = value.replace(/:(\w+)(\/|\b)/g, function(substring, match, nextMatch){
return obj[match] + nextMatch;
});
答案 1 :(得分:3)
假设您有以下javascript对象:
var myObject = { sessionId : 1 , id : 23 };
你可以循环每个属性并对原始字符串进行替换......
var value = "/sessions/:sessionId/events/:id";
for(var item in myObject){
value = value.replace(item, myObject[item]);
}
//value = "/sessions/:1/events/:23"
目前尚不清楚是否要保留:
个字符。如果没有,那么您可以在替换函数中包含它:
value = value.replace(':' + item, myObject[item]);
检查缺少的参数
如果您的对象中有任何额外的值在输入字符串中不存在,那么它们将没有任何效果。但是,如果你想在原始字符串中找不到其中一个项目时采取行动,那么你可以在循环中进行检查:
var noMatch = false;
for(var item in myObject){
if(value.indexOf(item) < 0){
noMatch = true;
}
value = value.replace(item, myObject[item]);
}
if(noMatch){
//something is wrong!
}
处理JSON
如果您执行实际上有一个JSON字符串,您可以将其转换为具有以下内容的对象:
var jsonString = '{"sessionId": 1, "id": 23}';
var myObject = JSON.parse(jsonString);
答案 2 :(得分:1)
这是另一种方法。
http://jsfiddle.net/rayweb_on/suHej/
var value = "/sessions/:sessionId/events/:id";
var source = { sessionId : 1 , id : 23 };
var result = value.replace(":sessionId",source.sessionId);
var result = result.replace(":id",source.id);
console.log(result);