Javascript - 在文本中替换基于对象的值的最快捷,最有效的方法

时间:2011-10-18 11:11:16

标签: javascript regex replace

我有一个看起来像这样的对象:

var obj = {
    a: "text",
    b: "text 2",
    c: "text 3",
    ...
}

我有一堆看起来像这样的字符串:

var stringA = "http://{{a}}.something.com/",
    stringB = "http://something.{{b}}.com/",
    stringC = "http://something.com/{{c}}";

我希望通过{{(\w)}}替换obj,并检查它是否具有每个字符串的匹配值,但我确信有更好更快的方法

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

道格拉斯·克罗克福德(Douglas Crockford)编写了一个名为supplant的函数,几乎完全符合您的要求。我稍微修改了这个函数以匹配你的双花括号 -

if (typeof String.prototype.supplant !== 'function') {
    String.prototype.supplant = function (o) {
        return this.replace(/{{([^{}]*)}}/g, function (a, b) {
            var r = o[b];
            return typeof r === 'string' ? r : a;
        });
    };
}

var obj = {
    a: "text",
    b: "text 2",
    c: "text 3"
}

var stringA = "http://{{a}}.something.com/",
    stringB = "http://something.{{b}}.com/",
    stringC = "http://something.com/{{c}}";

alert(stringA.supplant(obj));

演示 - http://jsfiddle.net/saZGg/

答案 1 :(得分:2)

var arr = /(.*){{(\w)}}(.*)/.exec(stringA);
arr[2] = obj[arr[2]];
arr.shift(); // remove full string at start
var newString = arr.join("");
  • 通常在字符串上运行正则表达式
  • 执行并将其转换为数组。
  • 将其中一个组换成对象哈希值
  • 将数组加入“已编译”字符串。

或者使用其中一个.replace解决方案,这些解决方案更优雅。

答案 2 :(得分:1)

这应该这样做:

function format(str, values) {
    return str.replace(/{{(\w)}}/g, function(match, name) {
        return values[name] || match;
    });
}

它只是查找对象是否具有捕获名称的属性。如果没有,没有任何东西被替换。

用法:

var str = format(stringA, obj);