如何使用eval并在对象中搜索值?

时间:2014-01-07 16:36:56

标签: javascript

我目前正在开发一个“简单”的税收计算器,它可以从数据库和当前托管的网页获取一些信息。例如,您在属性页面上,其中包含有关您家的详细信息。它会找到特定的信息:税区,财产类型和当前值等等。除此之外,数据库还有一些不断变化的信息,通过管理界面输入以开发税收公式。

我正在尝试使用eval来处理通过jsonp从数据库返回的公式。我遇到的问题是如何让eval函数识别公式所包含的变量位于“calculator”对象中。

json结果示例:

var calculator = {
  "Name": "Residential",
  "Formula": "(((rrb * (base + iv) - (hcv * homestead)) - (mcv * military)) * (levy / 1000))",
  "Levy": 1000.00000,
  "Variables": [
    {
      "Type": "System",
      "DisplayName": "Tax District",
      "ShortName": "levy",
      "Value": 0.000000
    },
    {
      "Type": "Form Variable",
      "DisplayName": "Current Property Value",
      "ShortName": "currentValue",
      "Value": 0.000000
    },
    {
      "Type": "Form Variable",
      "DisplayName": "Number of Homestead Credits",
      "ShortName": "homestead",
      "Value": 0.000000
    },
    {
      "Type": "Form Variable",
      "DisplayName": "Number of Military Credits",
      "ShortName": "military",
      "Value": 0.000000
    },
    {
      "Type": "Rollback",
      "DisplayName": "Residential Rollback",
      "ShortName": "rrb",
      "Value": 0.528200
    },
    {
      "Type": "User Input",
      "DisplayName": "Total Value Add of Improvements",
      "ShortName": "iv",
      "Value": 0.000000
    },
    {
      "Type": "Credit",
      "DisplayName": "Homestead Credit Value",
      "ShortName": "hcv",
      "Value": 4850.000000
    },
    {
      "Type": "Credit",
      "DisplayName": "Military Credit Value",
      "ShortName": "mcv",
      "Value": 1852.000000
    }
  ]
}

使用上面的对象,与eval一起使用的公式只会查看全局命名空间,但我真的不希望以这种方式公开变量。

让et与eval很好地融合的最简单方法是什么?理想情况下,我可以将一些函数传递给对象,它可以使值很容易地被eval函数使用。

3 个答案:

答案 0 :(得分:1)

好的,先关闭:不要这样做eval用户给你的任何东西都是绝对不安全的,因为它可以打开各种令人讨厌的攻击向量。

严重。 不要这样做。写一个解析器,它会为你做这个。这将是一个痛苦的屁股,但我保证,无论如何,一旦有明显的安全漏洞,你将最终做到这一点。

但是,如果你仍然坚持这样做:

无法使用evaleval.call告诉{p> eval.apply使用新的上下文。您必须通过定义在特定对象上下文中调用的函数来自行按摩范围。

拿这段代码:

var o = {
  s: 'catpants',
  t: 'doggyhat',
  f: function(statement) {
    return eval(statement);
  }
}

通过致电o.f("this.s + ' ' + this.t");,您将获得catpants doggyhat

对于您的情况,您必须定义一个对象来解析用户可能在表达式中使用的所有变量,然后在该对象上定义一个eval用户语句的函数。

答案 1 :(得分:1)

可能这可以帮到你:

var calculator = {
  Name: "Residential",
  Formula : function(){
      return (((rrb * (base + iv) - (hcv * homestead)) - (mcv * military)) * (levy / 1000));
  },
  Levy: 1000.00000,
  Variables: [
    {
      "Type": "System",
      "DisplayName": "Tax District",
      "ShortName": "levy",
      "Value": 0.000000
    },
    {
      "Type": "Form Variable",
      "DisplayName": "Current Property Value",
      "ShortName": "currentValue",
      "Value": 0.000000
    },
    {
      "Type": "Form Variable",
      "DisplayName": "Number of Homestead Credits",
      "ShortName": "homestead",
      "Value": 0.000000
    },
    {
      "Type": "Form Variable",
      "DisplayName": "Number of Military Credits",
      "ShortName": "military",
      "Value": 0.000000
    },
    {
      "Type": "Rollback",
      "DisplayName": "Residential Rollback",
      "ShortName": "rrb",
      "Value": 0.528200
    },
    {
      "Type": "User Input",
      "DisplayName": "Total Value Add of Improvements",
      "ShortName": "iv",
      "Value": 0.000000
    },
    {
      "Type": "Credit",
      "DisplayName": "Homestead Credit Value",
      "ShortName": "hcv",
      "Value": 4850.000000
    },
    {
      "Type": "Credit",
      "DisplayName": "Military Credit Value",
      "ShortName": "mcv",
      "Value": 1852.000000
    }
  ]
}

我假设您的变量rrb, base, iv, hcv, homestead, mcv, military, levy 全局定义

答案 2 :(得分:0)

您需要为公式编写解析器。没有自动/简单的方法来做到这一点。