JS用对象中的键替换substring

时间:2016-07-29 10:36:13

标签: javascript angularjs regex

我正在一个解决方案中开发一个通用函数,它将/endpoint/{item.id}/disable/{item.name}替换为/endpoint/123/disable/lorem,我将函数传递给URL和item。

该项目是一个包含密钥idname的对象。

查找结构为{item.KEY}的项目并将其替换为item.KEY的最佳方法是什么?

2 个答案:

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

小提琴:https://jsfiddle.net/wovr4ct5/2/

答案 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.
});