如何使用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
相关产品推荐
相关产品推荐

