matchRules / checkMust / checkShould
matchRules方法用于判断一个数据对象是否符合指定的规则配置。checkMust方法用于校验一组规则是否全部满足(AND 逻辑),checkShould方法用于校验一组规则中是否任一满足(OR 逻辑)。
语法
javascript
matchRules(config, data)
checkMust(must, row)
checkShould(should, row)描述
matchRules 是一个通用的条件判断函数,根据 config 配置对象的字段决定判断方式:
- 当
config.must存在时,转交给checkMust处理,要求所有规则全部满足 - 当
config.should存在时,转交给checkShould处理,要求任一规则满足 - 当
config.condition存在时,执行单个条件判断,支持left/right直接取值或通过leftKey/rightKey从data中取值(使用 RW 路径访问)
checkMust 接收一个规则数组,对每条规则调用 matchRules,只有全部返回 true 时才返回 true(逻辑与)。
checkShould 接收一个规则数组,对每条规则调用 matchRules,只要有一条返回 true 即返回 true(逻辑或)。
这套函数常用于表格行的显示条件、表单字段的联动规则、权限校验等场景。
支持的 condition 类型
| condition | 含义 | 说明 |
|---|---|---|
eq | 等于 | left === right |
ne | 不等于 | left !== right |
lt | 小于 | left < right |
le | 小于等于 | left <= right |
gt | 大于 | left > right |
ge | 大于等于 | left >= right |
in | 包含于 | right 必须是字符串或数组,判断 right.includes(left) |
nin | 不包含于 | right 必须是字符串或数组,判断 !right.includes(left) |
has | 包含 | left 必须是字符串或数组,判断 left.includes(right) |
nhas | 不包含 | left 必须是字符串或数组,判断 !left.includes(right) |
notNull | 非空 | left 既不是 nil 也不是 empty |
isNull | 为空 | left 是 nil 或 empty |
any | 任意 | 始终返回 true |
注意事项
config中must、should、condition的判断优先级为:must>should>condition- 如果
config中没有任何匹配字段,函数默认返回true leftKey和rightKey使用 RW 路径语法从data中取值,例如'user/name'表示data.user.namein、nin操作要求right是字符串或数组类型,否则会输出错误日志并返回falsehas、nhas操作要求left是字符串或数组类型,否则会输出错误日志并返回falsenotNull和isNull使用 ramda 的isNil和isEmpty进行空值判断checkMust和checkShould内部会递归调用matchRules,支持规则嵌套- 该函数依赖 ramda(
isEmpty、isNil、type)和 RW 路径访问库
示例
基本条件判断
must 和 should 组合判断
浏览器兼容
matchRules、checkMust、checkShould 使用了现代 JavaScript 特性(可选链操作符 ?. 等),需要支持 ES2020 的浏览器环境:
- Chrome 80+
- Firefox 74+
- Safari 13.1+
- Edge 80+
不支持 IE 浏览器。
性能考虑
- 时间复杂度: O(n) - 其中 n 是
must或should数组的长度(递归调用matchRules) - 空间复杂度: O(n) - 需要存储每次判断的结果数组
- 单个 condition 判断的时间复杂度为 O(1)
- 对于深层嵌套的 must/should 结构,递归深度等于嵌套层数
- 建议在批量数据校验场景中,预先解析规则配置,避免重复的 RW 路径解析开销