@ivan_kholodov

Как посчитать в строке и соединить текст использую данные из объекта?

Всем привет! Научите пожалуйста, как так сделать?
Проблема:
есть вот такой текст:
Привет, меня зовут {{name}}! У меня есть машина {{car}}


приходит объекты:
{
  name: 'car',
  options: {
    min: 'Audi',
    max: 'Big Toyota',
  }
},
{
  name: 'name',
  options: {
    min: 'Иван',
    max: 'Алексей Иванович',
  }
}


нужно пройтись по этому тексту и получить весь текст сообщения, но заменить при этом значение которое в {{name}} и {{car}} на данные из объекта. На минимальный текст и максимальный. То есть должно получится сообщение вида:
Привет, меня зовут Иван! У меня есть машина Audi
Привет, меня зовут Алексей Иванович! У меня есть машина Big Toyota


При этом сообщение - это инпут (message), в который вводится само сообщение и можно вставлять туда такие {{доп слова, типо переменных}} которые доступны над инпутом.
объекты это - fields

вот такой регуляркой я нахожу в тексте имя самой переменной и заменяю его обычное слово /(?<=\{{2}).+?(?=\}{2})/g
fields?.find(i => i.name === message.match(/(?<=\{{2}).+?(?=\}{2})/g)?.join())?.name

А как быть дальше? Пожалуйста подскажите, кто умеет делать подобные штуки (профессиональные)
  • Вопрос задан
  • 85 просмотров
Решения вопроса 3
vabka
@vabka
Токсичный шарпист
Тут проще без regex
Ответ написан
Stalker_RED
@Stalker_RED
function foo(mode) {
  return template.replace( // замена
    /{{(.+?)}}/g,  // слов в двойных фигурных скобках
    (_, varName) => data
    .find(e => e.name == varName) // ищем соответствующий объект
    .options[mode] // получаем минимальный или максимальный текст
  );
}

Ответ написан
WblCHA
@WblCHA
(() => {
  const fields = [
    {
      name: 'Car',
      options: {
        min: 'Audi',
        max: 'Big Toyota',
      }
    },
    {
      name: 'name',
      options: {
        min: 'Иван',
        max: 'Алексей Иванович',
      }
    }
  ];
  const origStr = 'Привет, меня зовут {{name}}! У меня есть машина {{car}}';
  
  const replaceKeysToText = (str, optionsKey) =>
    str.replace(/\{\{\s*(\w+)\s*\}\}/g, (fullMatch, key) => {
      const field = fields.find((f) => f.name.toLowerCase() === key);
      if(!field) {
        return fullMatch;
      }
      return field.options[optionsKey];
    });
  
  const short = replaceKeysToText(origStr, 'min');
  const long = replaceKeysToText(origStr, 'max');
  
  return [short, long];
})()
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы