You need to enable JavaScript to run this app. 如何使用无第三方依赖的原生JS将Datatables Search Builder嵌套JSON转为指定OR拼接格式
优惠活动
大模型
产品
解决方案
定价
更多

如何使用无第三方依赖的原生JS将Datatables Search Builder嵌套JSON转为指定OR拼接格式

原生JavaScript解析Datatables Search Builder嵌套过滤配置的实现

核心处理逻辑

Datatables Search Builder生成的过滤配置是标准递归树形结构,节点分为两类:

  • 叶子条件节点:包含condition、data、value属性,对应单条过滤规则
  • 分支组合节点:包含criteria子节点数组、logic属性(取值为AND/OR),对应多条件的逻辑组合
    解析过程采用递归遍历规则:
  1. 遇到叶子节点时,直接拼接为(字段名 运算符 对比值)格式字符串,示例中所有规则的对比值取value数组的首元素
  2. 遇到分支节点时,先递归解析所有子criteria得到对应字符串列表,用当前节点的logic值将列表元素拼接,再给整体拼接结果套一层括号
  3. 由于目标输出不需要最外层的包裹括号,最终解析完成后去掉结果首尾的多余括号即可

完整可运行代码

// 待解析的过滤配置对象
var sbfilter = {
  "criteria": [
    {
      "condition": "=",
      "data": "Registration",
      "value": ["1"]
    },
    {
      "criteria": [
        {
          "condition": "=",
          "data": "Registration",
          "value": ["2"]
        },
        {
          "condition": "=",
          "data": "Number",
          "value": ["3"]
        }
      ],
      "logic": "OR"
    },
    {
      "condition": "=",
      "data": "Number",
      "value": ["4"]
    },
    {
      "condition": "=",
      "data": "Station",
      "value": ["Yes"]
    }
  ],
  "logic": "OR"
};

/**
 * 递归解析过滤节点为对应字符串
 * @param {Object} node 待解析的配置节点
 * @returns {string} 拼接结果
 */
function parseFilterNode(node) {
  // 处理叶子单条件节点
  if (!node.criteria) {
    return `(${node.data}${node.condition}${node.value[0]})`;
  }
  // 处理分支组合节点
  const subResultList = node.criteria.map(subNode => parseFilterNode(subNode));
  const combinedStr = subResultList.join(node.logic);
  return `(${combinedStr})`;
}

// 执行解析
const rawParsedResult = parseFilterNode(sbfilter);
// 移除最外层多余的包裹括号
const finalOutput = rawParsedResult.slice(1, -1);
console.log(finalOutput);

运行输出

(Registration=1)OR((Registration=2)OR(Number=3))OR(Number=4)OR(Station=Yes)

输出结果完全匹配要求的目标格式,全程无第三方库依赖。


内容的提问来源于stack exchange,提问作者Jackson Christopher

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 16:54:03