解析复杂的字符串表达式布尔在Javascript
Parse complex String Expression to Boolean in Javascript
我已经得到了为复杂和嵌套json编写过滤器的任务。要做到这一点,我需要计算用户在输入字段中输入的布尔表达式。对于这个问题,假设我们有以下输入:
(Key1 = "foo" || key2 = 2 && key3 = "bar") && key4 = 7
我设法写了一个函数来评估每个键值对为"True"或"False",并在字符串中替换它们:例如:
(True || False && True) && True
现在我想把这个字符串解析成一个布尔表达式。是否有任何"简单"的方式(内置在函数,插件)的Javascript,可以解析这个字符串?
通常不建议使用eval()
,但也许在您的情况下它是合适的。查看更多详细信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval
你可以写:
eval("(true || false && true) && true") // Returns: 1
注意,我必须将True
重写为true
,因为True
不能被识别为布尔表达式。
然而,作用域应用于eval()
,所以我也可以写:
var True = 1;
var False = 0;
eval("(True || False && True) && True"); // Returns: 1
如果你事先知道变量,我想这对你来说是可行的。否则,可以看看https://silentmatt.com/javascript-expression-evaluator/或http://jsep.from.so/。
https://github.com/joewalnes/filtrex
一个简单、安全的JavaScript过滤器表达式编译器
// Input from user (e.g. search filter)
var expression = '(key1 == "foo" || key2 == 2 && key3 == "bar") && key4 == 7';
// Compile expression to executable function
var myfilter = compileExpression(expression);
// Execute function
myfilter({Key1: "foo", key2: 2, key3: "bar", key4: 7}); // returns 1
myfilter({}); // returns 0
// filter an array of objects
var data = [{key1: "foo"}, {key1: "foo2"}];
var results = data.filter(myfilter);
这个美丽的代价:92KByte最小化包大小
我启动了logic_fn项目,通过将自定义逻辑表达式(使用自定义操作符,如&, AND, -)转换为javascript表达式字符串,并将其提供给var f = new Function('input', 'return ' + expression + ';')
,在1KByte的压缩包中做类似的工作。new Function
比eval
更安全一点,但我仍然必须防御任意代码执行攻击。
为了避免使用eval,我使用http://jsep.from.so/,然后编写了一个函数来计算jsep的输出:
function evaluateBooleanExpressionTree(tree) {
if (tree.type == "Literal") {
return tree.value;
}
else if (tree.type == "LogicalExpression") {
if (tree.operator == "&&") {
return evaluateBooleanExpressionTree(tree["left"]) && this.evaluateBooleanExpressionTree(tree["right"]);
}
else {
return evaluateBooleanExpressionTree(tree["left"]) || this.evaluateBooleanExpressionTree(tree["right"]);
}
}
else {
// Unexpected node parsed
return null;
}
}
evaluateBooleanExpressionTree(jsep("(true || false && true) && true"))
// true
永远不要使用eval()!
我还为我的项目写了一个小的表达式解析器。它缺少一些操作符和功能,但非常有用,而且超轻(缩小1.6k)
下面是它的工作原理:
- 输入对象"主题"和逻辑表达式字符串
- 查找最深嵌套括号组
- 找到操作符
- 处理组并替换顶级组 中的输出循环
var myObject = {key1: "foo", key2: 2, key3: "bar", key4: 7};
var myExpression = "(key1 || key2 && key3) && key4";
var result = Operate.parse(myObject, myExpression);
这似乎是一个完美的地方使用eval
。但是,请通过对这个问题的回答来了解此解决方案的缺点。
-
eval
参考@ w3schools
- javascript中的布尔条件
- 我的django模板布尔变量是't在javascript中按预期工作
- 在javascript中否定布尔函数
- 如何从javascript/jquery中的复选框中获取布尔值
- 如何“;默认“;JavaScript中的布尔属性
- 在javascript函数的循环中设置全局布尔变量的最佳语法
- 使用“;布尔“;作为JavaScript中.filter()的参数
- 在Javascript中访问Razor布尔变量时出错
- 对Javascript感到困惑.布尔函数可以充当void函数
- 是 JavaScript 中的布尔对象
- 布尔对象上的逻辑 NOT 在 Javascript 中总是返回 false
- 带有多个布尔键的JavaScript Array.sort()
- 如何让Javascript将通过AJAX请求提取的tinyint(1)数据视为布尔值
- Javascript数组到布尔类型强制没有意义
- Javascript:我可以't找到正确的方式来表达布尔“;如果“;以得到我想要的结果
- 什么's VBA和Javascript布尔表达式之间的区别
- 为什么布尔(true)&&string是javascript中的字符串
- 评估JavaScript中给出布尔表达式的字符串
- Javascript TRUE和“;真“;为什么有人使用字符串而不是布尔值
- JavaScript:解析布尔