javascript - 在不使用 Eval() 的情况下从 JSON 对象解析 + 评估表达式?

标签 javascript node.js parsing

我正在构建一个 Node 应用程序,用户可以(理想情况下)在其中使用一系列 JSON 对象为地理数据定义样式:

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

在上面的例子中,我喜欢将这种风格评价为

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

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

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

最佳答案

如果您不想使用 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

关于javascript - 在不使用 Eval() 的情况下从 JSON 对象解析 + 评估表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17461353/

相关文章:

javascript - 在 Node.js 模块中使用函数

node.js - 如何将coffescript与AMD加载器和 Node 服务器一起使用?

用于日志解析的 C++ 库

javascript - 将 url 的文本列表转换为可点击的 HTML 链接

javascript - 你如何反向滚动......所以它从下到上?

javascript - 如何使用javascript :location.替换为response.redirect

javascript - node.js 错误 : req. flash() 需要 session

javascript - 使用sqlite3在node.js中变量的有效性

php - 解析错误 : syntax error, 意外的 $end in E :\xampp\htdocs\announcements\announcement. php on line 143

parsing - 具有不同结合性和相同优先级的相邻运算符的表达式消歧