Получение имени переменной, переданного в тегированном шаблоне - PullRequest
0 голосов
/ 24 июня 2018

Мне интересно, есть ли простой способ получить имя переменных внутри тегированной функции Template. Чтобы быть более понятным, это код:

let date = "2018"; //can be undefined
let description = "my description"; //can be undefined
let age; //can be undefined, and it is here
    function processString(parts) {
        var res = parts[0];
        for (var i=1; i<parts.length; i++) {
            if (arguments[i]) res += /*** arguments[i] is the value, I want to append the variable name too***/ arguments[i];
            res += parts[i];
        }
        return res;
    }
    console.log(processString`
    ${date}
    ${description}
    ${age}
    `);

Это результат

2018
my description
20

Я хочу это

date: 2018
description: my description
age: 20

EDIT: Вся цель состоит в том, чтобы сгенерировать список «необязательных» строк (конечно, исходный код более сложный, фактически он генерирует SQL-подобный запрос), но если переменная arguments [i] определена, я хочу добавить к результирующему строка "variable_name: variable_value" обратите внимание, что я редактировал функцию processString. Если есть какое-либо решение, я бы предпочел отредактировать processString и сохранить в чистоте console.log

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Вы можете получить желаемый результат, используя деструктуризацию объекта.

  const getVarName = (nameObj) => {
    for(let name in nameObj) {
      return name;
    }
  }

  let date = "2018";
  let description = "my description";
  let age = 20;
    function processString(parts) {
      var res = parts[0];
      for (var i=1; i<parts.length; i++) {
        res += /*** arguments[i] is the value, I want to append the variable name too***/ arguments[i];
        res += parts[i];
      }

      return res;
  }
    console.log(processString`
     -1 ${getVarName({date})} ${date}
     -2 ${getVarName({description})} ${description}
     -3 ${getVarName({age})} ${age}
    `);
0 голосов
/ 24 июня 2018

Чтобы расширить ответ Анджеласа, вы можете передать литерал объекта, так как:

{name}

- это то же самое, что и

{"name" : name}

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

function template(str, ...args) {
  let result = "";
  for(var i = 0; i < str.length - 1; i++) {
    result += str[i];
    result += Object.entries(args[i])[0].join(" : ");
  }
  result += str[i];
  return result;
}

Так что вы можете сделать:

template`
  1 - ${{date}}
  2 - ${{description}}
`;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...