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