Менять значение циклом в replace(regexp)

313
13 ноября 2017, 22:44
var a = "number one: {{one}}. number two: {{two}}";
function renderTemplate(template) {
  var reg = /({{\w*}})/g;
  return template.replace(reg, function(str){
      for(let i = 1; i < 3; i++){
          return i;
      }
  })
};   
renderTemplate(a);

Надо что бы в строку перезаписывалось 1 и 2, а записывается только 1(так как цикл сразу возвращает первое значение i). Как исправить ?

Я хочу такой вывод --> number one: 1. number two: 2
А получается такой --> number one: 1. number two: 1

Answer 1

Цикл внутри функции замены не нужен, так как эта функция и так вызывается для каждого из соответствий.

Нужно просто по найденной строке вернуть строку для замены, для этого можно использовать дополнительный объект:

var map = {
    one: 1,
    two: 2
};

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

/{{(\w*)}}/g

Теперь, первым параметром в функцию замены будет приходить полное соответствие: {{one}}, вторым - значение внутри группы: one.

При этом тело функции замены выродится в получение значения объекта по ключу

return map[str];

Пример в сборе

var a = "number one: {{one}}. number two: {{two}}"; 
 
function renderTemplate(template) { 
  var reg = /{{(\w*)}}/g; 
  var map = { 
    one: 1, 
    two: 2 
  }; 
 
  return template.replace(reg, function(_, str) { 
    return map[str]; 
  }) 
}; 
console.log(renderTemplate(a)); 
console.log(renderTemplate("number two: {{two}}. number one: {{one}}"));

Answer 2

Вы каждый раз перезапускаете цикл. Вынесите инициализацию переменной

function renderTemplate(template) {
  var reg = /({{\w*}})/g;
  var i = 1;
  return template.replace(reg, function(str){
          return i++;
  })
}; 

UPdate:

Не забудьте добавить проверку на существование свойства

function renderTemplate(template) {
  var reg = /{{(\w*)}}/g;
  var c = { one:1, two:2 }
  return template.replace(reg, function(full,str) {
          return c[str];
  })
};   
READ ALSO
Ошибки с реактивными формами

Ошибки с реактивными формами

Делаю форму и в одной из секций такой код:

238
json в дерево с указанием id и parent

json в дерево с указанием id и parent

Есть json данные, чтобы отобразить их в jquery плагине генераторе дерева, нужно перевести в формат с указанием id и parent id, причем почти во всех плагинах...

265