如何使用无第三方依赖的原生JS将Datatables Search Builder嵌套JSON转为指定OR拼接格式
原生JavaScript解析Datatables Search Builder嵌套过滤配置的实现
核心处理逻辑
Datatables Search Builder生成的过滤配置是标准递归树形结构,节点分为两类:
- 叶子条件节点:包含
condition、data、value属性,对应单条过滤规则 - 分支组合节点:包含
criteria子节点数组、logic属性(取值为AND/OR),对应多条件的逻辑组合
解析过程采用递归遍历规则:
- 遇到叶子节点时,直接拼接为
(字段名 运算符 对比值)格式字符串,示例中所有规则的对比值取value数组的首元素 - 遇到分支节点时,先递归解析所有子criteria得到对应字符串列表,用当前节点的logic值将列表元素拼接,再给整体拼接结果套一层括号
- 由于目标输出不需要最外层的包裹括号,最终解析完成后去掉结果首尾的多余括号即可
完整可运行代码
// 待解析的过滤配置对象 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
相关产品推荐
相关产品推荐

