Skip to content

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/rightKeydata 中取值(使用 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

注意事项

  • configmustshouldcondition 的判断优先级为:must > should > condition
  • 如果 config 中没有任何匹配字段,函数默认返回 true
  • leftKeyrightKey 使用 RW 路径语法从 data 中取值,例如 'user/name' 表示 data.user.name
  • innin 操作要求 right 是字符串或数组类型,否则会输出错误日志并返回 false
  • hasnhas 操作要求 left 是字符串或数组类型,否则会输出错误日志并返回 false
  • notNullisNull 使用 ramda 的 isNilisEmpty 进行空值判断
  • checkMustcheckShould 内部会递归调用 matchRules,支持规则嵌套
  • 该函数依赖 ramda(isEmptyisNiltype)和 RW 路径访问库

示例

基本条件判断

must 和 should 组合判断

浏览器兼容

matchRulescheckMustcheckShould 使用了现代 JavaScript 特性(可选链操作符 ?. 等),需要支持 ES2020 的浏览器环境:

  • Chrome 80+
  • Firefox 74+
  • Safari 13.1+
  • Edge 80+

不支持 IE 浏览器。

性能考虑

  • 时间复杂度: O(n) - 其中 n 是 mustshould 数组的长度(递归调用 matchRules
  • 空间复杂度: O(n) - 需要存储每次判断的结果数组
  • 单个 condition 判断的时间复杂度为 O(1)
  • 对于深层嵌套的 must/should 结构,递归深度等于嵌套层数
  • 建议在批量数据校验场景中,预先解析规则配置,避免重复的 RW 路径解析开销

相关函数

  • isRangeIn - 区间判断,可与 matchRules 配合使用
  • isType - 类型判断函数
  • looseHas - 宽松包含判断
  • RW - 路径访问函数,用于 leftKey/rightKey 取值