2

我正在尝试用对象中可比较的 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));
4

3 回答 3

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;
});
于 2013-07-24T15:41:05.640 回答
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);
于 2013-07-24T15:29:59.140 回答
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);
于 2013-07-24T15:36:15.807 回答