如何递归求解含嵌套结构的JSON逻辑表达式?
嵌套JSON逻辑表达式求值方案
问题描述
给定嵌套结构的JSON逻辑表达式,结构规则为:
- 每个逻辑表达式是长度为3的数组:
[左操作数, 运算符(AND/OR), 右操作数] - 操作数可以是布尔值对象(
{"key": true/false}),也可以是另一个嵌套的逻辑表达式数组
示例1:
const logicJson2 = [ [ { "key": true }, "OR", { "key": true } ], "AND", [ { "key": false}, "OR", { "key": true } ] ]
示例2:
const logicJson = [ [ [ { "key": false }, "AND", { "key": true } ], "OR", { "key": true } ], "AND", [ { "key": false}, "OR", { "key": true } ] ]
现有代码的问题
你写的analyze函数存在几个关键问题:
- 全局
store完全多余,递归函数应直接返回当前表达式的计算结果,无需额外存储 - 最终返回时错误直接取
term[0].key和term[2].key,忽略了嵌套表达式的递归结果(比如term[0]是数组时,应该用递归返回的布尔值而非原数组的key) store['first'] && store['second']的判断无意义,合法表达式的左右操作数必然存在
正确实现思路
核心就是递归求值,从最内层表达式开始计算,逐步向外推导——因为嵌套表达式必须先算出结果,才能作为外层表达式的操作数。具体步骤:
- 定义递归函数,接收一个表达式节点(数组或布尔对象)
- 如果节点是布尔对象(
{"key": ...}),直接返回其key值 - 如果节点是逻辑表达式数组:
- 递归计算左操作数(数组第0项)得到布尔值
- 递归计算右操作数(数组第2项)得到布尔值
- 根据中间运算符(数组第1项),对两个布尔值执行AND/OR运算并返回结果
高效实现代码
function evaluateLogic(expr) { // 处理基础布尔值节点 if (typeof expr === 'object' && !Array.isArray(expr)) { return expr.key; } // 处理逻辑表达式数组 const left = evaluateLogic(expr[0]); const operator = expr[1]; const right = evaluateLogic(expr[2]); switch(operator) { case 'AND': return left && right; case 'OR': return left || right; default: throw new Error(`不支持的运算符:${operator}`); } } // 测试示例1 console.log(evaluateLogic(logicJson2)); // 输出: true // 测试示例2 console.log(evaluateLogic(logicJson)); // 输出: true
关键说明
- 递归天然会优先处理最内层嵌套表达式,每次遇到数组就先递归计算左右操作数,直到触达最底层的布尔对象
- 代码是纯函数实现,无全局状态,逻辑清晰且高效,时间复杂度为O(n)(n为表达式中所有节点的数量)
- 可快速扩展支持更多运算符(比如NOT,只需调整表达式结构适配单目运算符逻辑)
内容的提问来源于stack exchange,提问作者nacho
相关产品推荐
相关产品推荐

