在Javascript中使用模板文字进行动态表达

时间:2017-10-03 07:21:31

标签: javascript reactjs react-native eval

如何使用动态值来评估表达式?例如,请考虑以下示例。

var a = 5;
var b = 10;
console.log(`Fifteen is ${a + b} and not ${2 * a + b}.`);

如果 a和b是动态名称会怎么样?意味着代替a和b,它可以是类似于某些值的东西' 。怎么做下面这样的事情? (名称可以是动态的)

 var 'someValue' = 1;
 console.log(`*Fifteen is ${'someValue' + b}* and not ${2 * a + b}.`);

简而言之,我想评估字段名称是动态的表达式。所以我不能静态定义变量。我该如何克服这个问题?

4 个答案:

答案 0 :(得分:3)

您可以使用bracket表示法和this关键字,该关键字是对窗口对象的引用。

window.name="Vicky";
window.test="test";
const message = (p0, p1) => `Hello, ${p0}. This is a ${p1}`;
console.log(message(window['name'],window['test']));

答案 1 :(得分:1)

也许eval符合您的需求。但是使用此功能careful



function test() {
  var a = 'Hello World',
      b = 1,
      c = 2,
      myVarRefA = 'a',
      myVarRefB = 'b',
      myVarRefC = 'c';
  
  console.log(`${eval(myVarRefA)} ${eval(myVarRefB + ' + ' + myVarRefC)}`);
}

test();




答案 2 :(得分:0)

您可以使用带有变量作为其属性的临时对象

let temp = Object.create(null);
temp["someVar"] =3;
temp["anotherVar"]=2;
console.log(temp["someVar"] + temp["anotherVar"]);

但你也可以使用更优雅的

let temp = Object.create(null);
temp.someVar =3;
temp.anotherVar=2;
console.log(temp.someVar+ temp.anotherVar);

小心你的"这个"绑定

答案 3 :(得分:0)

如果您的字段名称完全是自定义的,则可以使用Object.keys(..)。此方法将允许您遍历对象中的属性。

  

Object.keys()方法返回给定对象自己的数组   可枚举的属性,与a提供的顺序相同   for ... in循环(不同之处在于for-in循环枚举   原型链中的属性也是如此。

示例 (仅显示用法)

    const customObject = { name: 'Foo', age: 23, city: 'Bar City' };
    const getFormatedObject = (fieldsObject) => {
      const fields = {};
      Object.keys(fieldsObject).forEach((fieldName, index) => {
        fields[`f${index}`] = fieldsObject[fieldName];
      });
      return fields;
    }
    const formatedObject = getFormatedObject(customObject);
    for (let i = 0; i < Object.keys(formatedObject).length; i++) {
      console.log(formatedObject[`f${i}`]);
    }

如果您知道对象上的字段数,可以使用下面的字段。

const customObject = { name: 'Foo', age: 23, city: 'Bar City' };
const keys = Object.keys(customObject);
console.log(`His ${keys[0]} is ${customObject[keys[0]]} and ${keys[1]} is ${customObject[keys[1]]} and ${keys[2]} is ${customObject[keys[2]]}`);