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

从含分组节点的多维嵌套数组生成query string的技术问题

解决深度嵌套数组生成查询字符串的问题

我理解你需要把这种带分组、支持NOT/AND/OR操作符的嵌套数组转换成符合逻辑的查询字符串,递归处理是最适合这种不确定深度结构的方案。下面是具体的实现思路和代码:

核心思路

  1. 递归遍历每个分组:每个分组(数组中的对象)要么是普通的AND/OR分组(包含条件节点和子分组),要么是NOT分组(仅包含一个子分组)。
  2. 单独处理条件节点:把每个nodes项转换成字段名操作符"值"的格式,特殊操作符(比如BETWEEN)单独处理。
  3. 分组逻辑组合:
    • 对于NOT分组:直接生成NOT (子分组查询字符串)的格式。
    • 对于AND/OR分组:将当前分组的所有条件节点和子分组结果用操作符连接,多个项时用括号包裹保证优先级。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 16:22:51