在标记的模板中传递变量名

时间:2018-06-24 18:19:22

标签: javascript ecmascript-6

我想知道是否有一种简单的方法可以在已标记的模板函数中检索变量的名称。更清楚地说,这是代码:

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

编辑: 整个目的是生成“可选”行的列表(当然,原始代码更复杂,实际上它会生成类似SQL的查询),但是如果定义了变量arguments [i],我想将其附加到结果中字符串“ variable_name:variable_value”,请注意,我编辑了函数processString如果有解决方案,我希望编辑processString并保持console.log

2 个答案:

答案 0 :(得分:2)

要扩展Angelas的答案,您可以传入对象文字,例如:

{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}}
`;

答案 1 :(得分:2)

您可以通过对象分解获得所需的结果。

  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}
    `);