Функция работает не так как нужно!

Мой код:

String.prototype.translate = function(vars){
  for (const [KEY, value] of Object.entries(vars)) {
      return this.replace(/\%(KEY)\%/g,value)
  }
}

Должно быть так:

Congratulations,niksonbinsk on leveling up: 6

А на самом деле получается вот так:

Congratulations,%name% on leveling up: %level%

Что я делаю не так?


Ответы (2 шт):

Автор решения: Igor

String.prototype.translate = function(vars){
  var str = this;
  for (const [KEY, value] of Object.entries(vars)) {
    console.log(KEY, value);
    str = str.replace(new RegExp(`%${KEY}%`, 'g'), value)
  }
  return str;
}

console.log("Congratulations,%name% on leveling up: %level%".translate({
  name: "niksonbinsk",
  level: 6
}));

→ Ссылка
Автор решения: Grundy
  1. Для использования значения переменной в регулярном выражении нужно воспользоваться конструктором new RegExp

  2. return сразу прекращает выполнение цикла и метода, поэтому сейчас в цикле выполняется только первая итерация.

  3. метод .replace не меняет исходную строку, поэтому нужно сохранять результат на каждой итерации

В итоге код может выглядеть так:

String.prototype.translate = function(vars){
  var result = this;
  for (const [KEY, value] of Object.entries(vars)) {
      result = result.replace(new RegExp('\\%(' + KEY + ')\\%', 'g'),value)
  }
  return result;
}
→ Ссылка