Javascript - самый быстрый и эффективный способ заменить объектные значения в тексте - PullRequest
1 голос
/ 18 октября 2011

У меня есть объект, который выглядит так:

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 ]

6 голосов
/ 18 октября 2011

Дуглас Крокфорд написал функцию под названием 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/

2 голосов
/ 18 октября 2011
var arr = /(.*){{(\w)}}(.*)/.exec(stringA);
arr[2] = obj[arr[2]];
arr.shift(); // remove full string at start
var newString = arr.join("");
  • Обычно запускайте регулярное выражение для строки,
  • выполняйте и превращайте его в массив.
  • Поменяйте местами одну из групп на значение в хэше вашего объекта
  • присоедините массив к вашей "скомпилированной" строке.

Или используйте одну из .replace решения, которые, возможно, более элегантны.

1 голос
/ 18 октября 2011

Это должно сделать это:

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

Он просто смотрит, есть ли у объекта свойство с захваченным именем.Если нет, то ничего не заменяется.

Использование:

var str = format(stringA, obj);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...