从含分组节点的多维嵌套数组生成query string的技术问题
解决深度嵌套数组生成查询字符串的问题
我理解你需要把这种带分组、支持NOT/AND/OR操作符的嵌套数组转换成符合逻辑的查询字符串,递归处理是最适合这种不确定深度结构的方案。下面是具体的实现思路和代码:
核心思路
- 递归遍历每个分组:每个分组(数组中的对象)要么是普通的AND/OR分组(包含条件节点和子分组),要么是NOT分组(仅包含一个子分组)。
- 单独处理条件节点:把每个
nodes项转换成字段名操作符"值"的格式,特殊操作符(比如BETWEEN)单独处理。 - 分组逻辑组合:
- 对于NOT分组:直接生成
NOT (子分组查询字符串)的格式。 - 对于AND/OR分组:将当前分组的所有条件节点和子分组结果用操作符连接,多个项时用括号包裹保证优先级。
- 对于NOT分组:直接生成
JavaScript实现代码
// 处理单个条件节点,转换成查询片段 function buildCondition(node) { const { fieldValue, operator, primaryOperandValue, secondaryOperandValue } = node.values; const fieldName = fieldValue.FieldName; let condition = `${fieldName}${operator}`; // 根据操作符类型处理值的拼接 switch (operator.trim()) { case 'BETWEEN': condition += ` "${primaryOperandValue}" AND "${secondaryOperandValue}"`; break; case '=': case '>': case '<': case 'ENDS_WITH': case 'BEGINS_WITH': condition += ` "${primaryOperandValue}"`; break; // 可以根据需要扩展更多操作符,比如LIKE、IN等 default: condition += ` "${primaryOperandValue}"`; } return condition; } // 递归处理分组,生成完整的查询片段 function buildQueryGroup(group) { // 收集当前分组的所有条件和子分组结果 const queryParts = []; // 处理当前分组的条件节点 group.nodes.forEach(node => { queryParts.push(buildCondition(node)); }); // 处理当前分组的子分组 group.children.forEach(childGroup => { queryParts.push(buildQueryGroup(childGroup)); }); // 处理NOT操作符的特殊情况 if (group.operator === 'NOT') { // NOT分组必须包含一个子分组,直接递归处理子分组并包裹NOT() const childQuery = buildQueryGroup(group.children[0]); return `NOT (${childQuery})`; } else { // AND/OR分组:根据片段数量决定是否加括号 if (queryParts.length === 0) return ''; if (queryParts.length === 1) return queryParts[0]; // 多个片段时用操作符连接并包裹括号,保证逻辑优先级 return `(${queryParts.join(` ${group.operator} `)})`; } } // 处理你的输入数组 const inputGroups = [ // 这里放入你提供的完整数组 ]; // 生成最终查询字符串 const finalQuery = buildQueryGroup(inputGroups[0]); console.log(finalQuery);
针对你提供的数组的输出结果
运行上述代码后,会生成如下查询字符串:
(ORIGINAL_FILE_NAME="new" AND NOT ((CONTROL_NUMBER BETWEEN "x" AND "y" AND NOT ((CONTROL_NUMBER > "30")))) AND (EMAIL_ANY_ADDRESS ENDS_WITH "log" OR EMAIL_ANY_ADDRESS BEGINS_WITH "log"))
关键点说明
- 递归的灵活性:不管你的嵌套深度有多深,递归都会自动遍历所有层级,不需要手动处理每一层的结构。
- NOT分组的特殊处理:严格按照你的需求,NOT分组本身不包含条件节点,只包裹一个子分组。
- 括号的自动添加:当一个分组有多个条件或子分组时,自动添加括号,确保逻辑运算的优先级正确,和你给出的示例格式一致。
- 可扩展性:如果需要支持更多操作符(比如
LIKE、IN),只需要在buildCondition函数中添加对应的处理逻辑即可。
内容的提问来源于stack exchange,提问作者Robin
相关产品推荐
相关产品推荐

