Javascript 获取传入标记模板的变量名

Javascript 获取传入标记模板的变量名,javascript,ecmascript-6,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];

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

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}
    `);
我想要这个

date: 2018
description: my description
age: 20
编辑: 其全部目的是生成一个“可选”行列表(当然,原始代码更复杂,实际上它生成了一个类似SQL的查询),但是如果定义了变量参数[i],我想附加到结果字符串“variable\u name:variable\u value”,请注意,我编辑了函数
processString

如果有任何解决方案,我更愿意编辑
processString
并保持
控制台的干净。log

要扩展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;
}

通过使用对象分解可以获得所需的结果

  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}
    `);
const getVarName=(nameObj)=>{
for(在nameObj中输入名称){
返回名称;
}
}
let date=“2018”;
让description=“我的描述”;
年龄=20岁;
函数processString(部件){
var res=零件[0];

对于(var i=1;iYes)这是可能的,但我能想到的每一种方法都需要一些非常粗糙的
用法和
和代理,所以我想最好只传入名称
${“date”}
,然后作为
窗口[参数[i]]
访问它的值,或者只需硬编码
日期:${date date}
这实际上是一个非常聪明的想法。我会将其更改为
${{name}}
,然后让模板完成它的工作。请阅读编辑,变量实际上可以是未定义的(每一行都是可选的)
template`
  1 - ${{date}}
  2 - ${{description}}
`;
  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}
    `);