代码之家  ›  专栏  ›  技术社区  ›  alfredopacino

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

  •  3
  • alfredopacino  · 技术社区  · 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的查询),但是如果变量参数i是定义的,我想追加到结果字符串中。 processString 是的。 如果有任何解决方案,我宁愿编辑 处理字符串 保持清洁 console.log

    2 回复  |  直到 6 年前
        1
  •  2
  •   Jonas Wilms    6 年前

    要扩展Angelas的答案,可以传入一个object literal,如下所示:

    {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}}
    `;
    
        2
  •  2
  •   Angela Hayrapetian    6 年前

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

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