JavaScript如何将操作符操作数数组拼接为MySQL查询字符串
JavaScript实现嵌套逻辑结构转MySQL查询条件字符串
问题背景
正在开发基于JavaScript的MySQL查询语句生成工具,通过独立输入框分别录入操作符与操作数,当前使用的测试示例数组如下:
var array = [ "OR", ["<", "col1", "col2"], [ "AND", ["==", "col3", "col4"], ["!=", "colx", "coly"]]]; var array2 = [ "OR", ["<", "col1", "col2"], [ "AND", ["==", "col3", "col4"], ["!=", "colx", "coly"], ["<", "colo", "othercol"]]];
预期生成的查询条件字符串如下:
"col1 < col2 OR (col3 == col4 AND colx != coly)" "col1 < col2 OR (col3 == col4 AND colx != coly AND colo < othercol)"
现有实现的缺陷
当前编写的createString函数仅做了单层遍历,没有处理嵌套递归逻辑,也没有实现复合逻辑块自动加括号的规则,无法输出符合预期的结果,现有代码如下:
function createString(array) { var string = ''; for(var i = 0; i < array.length; i++) { if(Array.isArray(array[i])) { if(array[i].length == 3) { var operator = array[i][0]; var variable1 = array[i][1]; var variable2 = array[i][2]; string+= variable1+operator+variable2; } }else { string+=array[i]; } } return string; }
实现思路
传入的数组是标准的嵌套表达式树结构,靠单层循环没法处理多层嵌套,必须用递归逐层解析,核心规则如下:
- 先判断节点类型:如果数组长度为3、且第一个元素不是
AND/OR,就是普通二元比较表达式,直接按「左操作数 操作符 右操作数」格式拼接即可 - 如果数组第一个元素是
AND/OR,就是逻辑运算块:先把后面所有子节点逐个递归解析成字符串,再用当前逻辑运算符把所有子串拼接起来 - 只有最外层(根节点)的逻辑运算块不需要加括号,所有嵌套在内层的逻辑块,拼接完成后都要在外层包一层括号,保证运算优先级和预期一致
- 所有运算符和操作数之间留空格,符合常规SQL书写格式
可运行实现代码
function createString(node, isRoot = true) { // 处理普通二元比较表达式 if (node.length === 3 && !['AND', 'OR'].includes(node[0])) { return `${node[1]} ${node[0]} ${node[2]}`; } // 处理逻辑运算节点 const op = node[0]; const childNodes = node.slice(1); const parsedChildren = childNodes.map(child => createString(child, false)); const joinedStr = parsedChildren.join(` ${op} `); // 根节点无需加括号,内层逻辑块包裹括号 return isRoot ? joinedStr : `(${joinedStr})`; } // 测试用例 console.log(createString(array)); // 输出:col1 < col2 OR (col3 == col4 AND colx != coly) console.log(createString(array2)); // 输出:col1 < col2 OR (col3 == col4 AND colx != coly AND colo < othercol)
内容的提问来源于stack exchange,提问作者Manoj Dhiman
相关产品推荐
相关产品推荐

