【问题标题】:Parsing + Evaluating Expressions From JSON Object without using Eval()?在不使用 Eval() 的情况下解析 + 评估来自 JSON 对象的表达式?
【发布时间】:2013-07-04 03:23:34
【问题描述】:

我正在构建一个节点应用程序,其中用户(理想情况下)能够使用一系列 JSON 对象定义样式 - 用于地理数据:

{
    "style":
        {
            "test": "year",
            "condition": "<= 1954 AND >= 1936",
            "color": "red"
        }
}

在上述情况下,我喜欢将这种风格评估为

if (year <= 1954 && year >= 1936){
    object.color = red;
}

有没有一种简单的方法来解析+评估此类表达式/从此类对象构建它们?我对让人们将使用 =、||、&& 等构建的复杂表达式串在一起特别感兴趣。

如果可能,我想避免使用 eval()。

【问题讨论】:

  • 您可能想查看我的项目语言 Bianca:github.com/aaditmshah/bianca。它解析一个程序并输出一个 JSON AST,这与您的程序所做的完全相反。不过,它可能会给您一些有价值的见解。
  • 我一定会去看看的!谢谢!

标签: javascript node.js parsing


【解决方案1】:

如果您不想使用 eval,则必须编写自己的小解析器并创建如下定义语言:

"condition": ["and", ["<=", 1954], [">=", 1936]],

这是您可以考虑的部分实现:

function do_and(args, value)
{
  for (var i = 0; i < args.length; ++i) {
    if (!evaluate(args[i], value)) {
      return false;
    }
  }
  return true;
}

function evaluate(condition, value)
{
  switch (condition[0]) {
    case "and":
      return do_and(condition.slice(1), value);

    case "<=":
      return value <= condition[1];

    case ">=":
      return value >= condition[1];
  }
}

这就是你将如何使用它:

var style = {
    "test": "year",
    "condition": ["and", ["<=", 1954], [">=", 1936]],
    "color": "red"
}, context = {
  "year": 1940
};    

if (evaluate(style.condition, context[style.test])) {
  console.log(style.color); // "red"
}

Demo

【讨论】:

  • 从您的回答中不清楚您是否希望用户提供此格式或解析器解析为这种格式 - 当然前者更容易:)。
  • @nrabinowitz 编写解析器并没有花那么长时间,所以我已经包含了部分实现:)
【解决方案2】:

类似

var obj = JSON.parse(str);
switch (obj.style.operator){
    case '=':
    if (window[obj.style.condition] === obj.style){//assuming that the conditions are global
        object.color = obj.style;
    }
    break;
    ...
}

【讨论】:

  • 酷,我已经实现了类似的东西,但是你对我如何做更复杂的表达式有什么想法吗?例如。假设用户想要测试某个值是否 >= 1954 或
  • @sir_kitty 那么为什么不发布关于复杂表达式的内容,而不是您已经可以发布的内容。
猜你喜欢
  • 1970-01-01
  • 2022-06-20
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 2010-12-06
相关资源
最近更新 更多