在对谷歌和堆栈溢出进行了数小时的研究后,我得出结论,以下JSON结构正确描述了一个布尔表达式。我不是非常热衷于算法,但是在英语(和/或javascript)中,你将如何递归遍历树来重建表达式,所以在这个例子中,表达式将是:
13或14或(18和20和19)
var booleanExpression = {
op : 'or',
left : {
op : 'or',
left: {
op : 'or',
left : {
op : 'literal',
value: '14'
},
right: {
op : 'and',
left : {
op : 'and',
left : {
op : 'literal',
value: '20'
},
right: {
op : 'literal',
value: '19'
}
},
right: {
op : 'literal',
value: '18'
}
}
}
},
right: {
op : 'literal',
value: '13'
}
};
答案 0 :(得分:4)
Recursion是您评估表达式树的朋友。您需要做的就是处理各个操作类型,并推迟对其子项的递归计算。通常,解析/评估事物的难点在于将其变为基于树的结构。之后,以递归方式遍历树很容易:
function eval_expr(expr) {
if( !expr ) { return false; }
var op = expr.op;
if( op == 'literal' ) {
return expr.value;
} else if( op == 'or' ) {
return "(" + eval_expr(expr.left) + ") or (" + eval_expr(expr.right) + ")";
} else if( op == 'and' ) {
return "(" + eval_expr(expr.left) + ") and (" + eval_expr(expr.right) + ")";
}
console.error("Unhandled op:" + expr.op);
}
> eval_expr(booleanExpression);
"(((14) or (((20) and (19)) and (18))) or (false)) or (13)"
请注意,此函数将非零'literal'类型值视为true,将零值视为false。