Javascript JS对象中的求值公式

Javascript JS对象中的求值公式,javascript,Javascript,我的目标如下: var data = { 'buyRate': ['Buy Rate', 0.15, 'enteredData.numberOfTransactions * enteredData.buyRate', 'setupFee': ['Setup Fee', 0.00, 'enteredData.setupFee'], 'numberOfTransactions': ['# of Trans.', 10, 'enteredData.numberOfTransactions'

我的目标如下:

var data = {
  'buyRate': ['Buy Rate', 0.15, 'enteredData.numberOfTransactions * enteredData.buyRate',
  'setupFee': ['Setup Fee', 0.00, 'enteredData.setupFee'],
  'numberOfTransactions': ['# of Trans.', 10, 'enteredData.numberOfTransactions']
}
enteredData是从用户输入中提取值的另一个对象。在此对象之后创建,但它确实存在

我要做的是使用数组中的第三个位置作为公式来计算“总计”,它使用如下脚本显示。创建对象后,我运行此脚本,以便对象关键点不会未定义:

for (var key in data) {
  var formula = data[key][2];
  // evaluate the formula by some magic
  var sum = new Function('return '+formula);
  document.getElementBy(key+'Total').value = sum;
}
因为我在谷歌网站工作,使用eval不是我的选择。我尝试过使用var sum=新函数'return'+公式;而且这对我不起作用。我没有发现任何错误。和console.log不显示其他信息:

function anonymous() {
  return data.numberOfTransactions * data.buyRate
}
我不知道还有什么办法解决这个问题。如果谷歌不允许eval,我想他们也不允许使用你的函数技巧运行用户提供的代码

但是,如果不是这样,则需要稍微更改函数。国家:

使用函数构造函数创建的函数不会为其创建上下文创建闭包;它们始终在全局范围内创建。运行它们时,它们将只能访问自己的局部变量和全局变量,而不能访问调用函数构造函数的作用域中的变量

因此,您需要传递正确的变量,如下所示:

for (var key in data) {
  var formula = data[key][2];

  // create function
  var my_func = new Function('data', 'return ' + formula);

  // pass data explicitely
  var sum = my_func(data);

  document.getElementBy(key+'Total').value = sum;
}
for (var key in data) {
  var sum = data[key][2];
  document.getElementBy(key+'Total').value = sum();
}
如果谷歌不允许eval,我猜他们也不允许使用你的函数技巧运行用户提供的代码

但是,如果不是这样,则需要稍微更改函数。国家:

使用函数构造函数创建的函数不会为其创建上下文创建闭包;它们始终在全局范围内创建。运行它们时,它们将只能访问自己的局部变量和全局变量,而不能访问调用函数构造函数的作用域中的变量

因此,您需要传递正确的变量,如下所示:

for (var key in data) {
  var formula = data[key][2];

  // create function
  var my_func = new Function('data', 'return ' + formula);

  // pass data explicitely
  var sum = my_func(data);

  document.getElementBy(key+'Total').value = sum;
}
for (var key in data) {
  var sum = data[key][2];
  document.getElementBy(key+'Total').value = sum();
}

这里的答案对我很有帮助,但在我发现谷歌网站也不允许创建函数构造函数之后,我用了另一种方式来实现这一点,让我保留了我想要的逻辑

下面是更新的对象。我只是将公式改写为一个可以调用的小函数:

var data = {
  'buyRate': ['Buy Rate', 0.15, function() {return enteredData.numberOfTransactions * enteredData.buyRate;},
  'setupFee': ['Setup Fee', 0.00, function() {return enteredData.setupFee;}],
  'numberOfTransactions': ['# of Trans.', 10, function() {return enteredData.numberOfTransactions;}]
}
这将在每次调用公式时运行公式,而不是在渲染对象时运行公式

我的更新For…in循环如下所示:

for (var key in data) {
  var formula = data[key][2];

  // create function
  var my_func = new Function('data', 'return ' + formula);

  // pass data explicitely
  var sum = my_func(data);

  document.getElementBy(key+'Total').value = sum;
}
for (var key in data) {
  var sum = data[key][2];
  document.getElementBy(key+'Total').value = sum();
}

希望这能对将来的人有所帮助。

这里的答案对我有所帮助,但在我发现谷歌网站也不允许创建函数构造函数之后,我用了另一种方式来实现这一点,让我保留了我想要的逻辑

下面是更新的对象。我只是将公式改写为一个可以调用的小函数:

var data = {
  'buyRate': ['Buy Rate', 0.15, function() {return enteredData.numberOfTransactions * enteredData.buyRate;},
  'setupFee': ['Setup Fee', 0.00, function() {return enteredData.setupFee;}],
  'numberOfTransactions': ['# of Trans.', 10, function() {return enteredData.numberOfTransactions;}]
}
这将在每次调用公式时运行公式,而不是在渲染对象时运行公式

我的更新For…in循环如下所示:

for (var key in data) {
  var formula = data[key][2];

  // create function
  var my_func = new Function('data', 'return ' + formula);

  // pass data explicitely
  var sum = my_func(data);

  document.getElementBy(key+'Total').value = sum;
}
for (var key in data) {
  var sum = data[key][2];
  document.getElementBy(key+'Total').value = sum();
}

希望这对将来的人有所帮助。

在您的示例中,code data.numberOfTransactions*data.buyRate是两个数组的乘积。我不认为那是你想做的。此外,在使用函数时,对数据的引用可能指向数据对象,也可能不指向数据对象。不会像编写常规函数那样创建闭包,它们引用全局作用域。而且,您永远不会对函数求值。您需要调用sum。通过eval或某些函数构造来评估用户提供的代码有潜在的危险。没有更好的办法了吗?这通常是代码结构不好的标志。@JorgeCabot谢谢。这是我在这里创建示例时的错误。我更新了代码。公式实际上引用了另一个对象。还有,我忘了叫sum。这就成功了。@GeorgSchölly我对任何其他方法都感兴趣。在您的示例中,代码data.numberOfTransactions*data.buyRate是两个数组的乘积。我不认为那是你想做的。此外,在使用函数时,对数据的引用可能指向数据对象,也可能不指向数据对象。不会像编写常规函数那样创建闭包,它们引用全局作用域。而且,您永远不会对函数求值。您需要调用sum。通过eval或某些函数构造来评估用户提供的代码有潜在的危险。没有更好的办法了吗?这通常是代码结构不好的标志。@JorgeCabot谢谢。这是我在这里创建示例时的错误。我更新了代码。公式实际上引用了另一个对象。还有,我忘了叫sum。“这让它起作用了。”@GeorgSchölly我会对任何其他方法感兴趣。这是一个更好的方法。这是一个更好的方法。