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我会对任何其他方法感兴趣。这是一个更好的方法。这是一个更好的方法。