You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何递归求解含嵌套结构的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']的判断无意义,合法表达式的左右操作数必然存在

正确实现思路

核心就是递归求值,从最内层表达式开始计算,逐步向外推导——因为嵌套表达式必须先算出结果,才能作为外层表达式的操作数。具体步骤:

  1. 定义递归函数,接收一个表达式节点(数组或布尔对象)
  2. 如果节点是布尔对象({"key": ...}),直接返回其key值
  3. 如果节点是逻辑表达式数组:
    • 递归计算左操作数(数组第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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 12:30:55