Как заменить ключевые совпадения только в квадратных скобках? - PullRequest
2 голосов
/ 02 июня 2019

Я работаю над некоторой функцией, которая заменяет вхождения строки, заключенной в квадратные скобки, которая соответствует ключу, с соответствующим значением из данного объекта, но я не знаю, как заменить только эти строки внутри квадратных скобок, это заменяет все, я был бы признателен за вашу помощь:

Это то, что я пробовал до сих пор:

function template(str, obj){
  let new_str = str;

  for (let key in obj) 
  {
       new_str = new_str.replace(new RegExp(key, 'g'), obj[key]);
  }
 console.log(new_str);
}

template("Hi [name], your balance is [balance]", { name: "Joe", balance: 1200 });

Я получаю:

"Hi [Joe], your 1200 is [12000]"

ноЯ ожидаю:

"Hi Joe, your balance is 12000"

Ответы [ 2 ]

0 голосов
/ 02 июня 2019

Вам тоже нужно совпадение []. Используйте литералы шаблона и заверните ключ в [] в RegExp

function template(str, obj){
  let new_str = str;

  for (let key in obj) 
  {
       new_str = new_str.replace(new RegExp(`\\[${key}\\]`, 'g'), obj[key]);
  }
 console.log(new_str);
}

template("Hi [name], your balance is [balance]", { name: "Joe", balance: 1200 });
0 голосов
/ 02 июня 2019

Поскольку ключи заключены в квадратные скобки, вы также должны указать это в своем шаблоне:

function template(str, obj) {
  let new_str = str;

  for (let key in obj) {
    new_str = new_str.replace(new RegExp('\\[' + key + '\\]', 'g'), obj[key]);
  }
  console.log(new_str);
}

template("Hi [name], your balance is [balance]", {
  name: "Joe",
  balance: 1200
});

Вы также можете рассмотреть возможность использования только одного регулярного выражения с функцией замены, чтобы упростить код:

const template = (str, obj) => str.replace(
  /\[([^\]]*)\]/g,
  (match, possibleKey) => obj[possibleKey] ? obj[possibleKey] : match
);

console.log(template("Hi [name], your balance is [balance]", {
  name: "Joe",
  balance: 1200
}));

Если то, что содержится в квадратных скобках, всегда будет существовать в объекте, тогда нет необходимости в условном операторе:

const template = (str, obj) => str.replace(
  /\[([^\]]*)\]/g,
  (_, key) => obj[key]
);

console.log(template("Hi [name], your balance is [balance]", {
  name: "Joe",
  balance: 1200
}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...