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

如何使用JavaScript将条件数组拼接为指定and/or逻辑格式字符串

实现方法

核心是先按字段对条件做分组,再按规则拼接字符串,步骤如下:

  • 提取每个条件的分组标识:定位条件中第一个查询操作符(/any(、eq)的位置,截取位置前的字段路径作为分组key,保证同字段的查询条件归为同一组
  • 遍历条件数组完成分组聚合,相同key的条件存入同一个数组
  • 单组内的条件用or连接,外层包裹圆括号
  • 所有分组处理完成后,用\n\nand 作为分隔符拼接,得到最终的查询字符串

完整代码

function buildQueryString(conditions) {
  const conditionGroups = new Map();

  for (const cond of conditions) {
    // 定位第一个操作符的位置,用于切分分组key
    const anyOpPos = cond.indexOf('/any(');
    const eqOpPos = cond.indexOf(' eq ');
    
    let splitPos;
    if (anyOpPos === -1) splitPos = eqOpPos;
    else if (eqOpPos === -1) splitPos = anyOpPos;
    else splitPos = Math.min(anyOpPos, eqOpPos);

    const groupKey = cond.slice(0, splitPos);
    if (!conditionGroups.has(groupKey)) {
      conditionGroups.set(groupKey, []);
    }
    conditionGroups.get(groupKey).push(cond);
  }

  // 处理每个分组为括号包裹的or片段
  const groupFragments = [];
  for (const group of conditionGroups.values()) {
    groupFragments.push(`(${group.join(' or ')})`);
  }

  // 用and连接所有分组
  return groupFragments.join('\n\nand ');
}

// 测试用例
const input = [
 "perfumers/any(perfumer: perfumer/name eq 'Test1')",
 "perfumers/any(perfumer: perfumer/name eq 'Test2')",
 "line_unit/name eq 'EDC'",
 "line_unit/name eq 'EDT'",
 "line_unit/name eq 'EDM'",
 "line_unit/name eq 'EDK'",
 "color/name eq 'RED'",
 "color/name eq 'BLUE'",
];

console.log(buildQueryString(input));

运行输出

(perfumers/any(perfumer: perfumer/name eq 'Test1') or perfumers/any(perfumer: perfumer/name eq 'Test2'))

and (line_unit/name eq 'EDC' or line_unit/name eq 'EDT' or line_unit/name eq 'EDM' or line_unit/name eq 'EDK')

and (color/name eq 'RED' or color/name eq 'BLUE')

给出的目标示例中line_unit分组末尾存在笔误:'EDK)缺少闭合单引号,上述代码输出为语法正确的标准格式。如果后续需要兼容gt/lt/ne等其他比较操作符,只需要在切分分组key的逻辑里补充对应操作符的位置判断即可。

内容的提问来源于stack exchange,提问作者Javascript user

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 11:24:41