场景介绍
- 在选配业务中一组配件(干扰源)与另一组配件(目标源)之间存在单向或双向的依赖、互斥的情况,
- 细节
- 选择配件时没有先后顺序
- 一类配件中可以是单选或者多选
- 触发:单向情况必须满足左侧干扰源条件才为触发,双向满足一个源即为触发
- 满足:即左右两个条件均满足
- 表达式示例
- eg: (A || B) && !C1 => E || (F && G)
- ( A 或 B )且 非C1 单向依赖于 E 或( F 且 G )
- 假如 C1 所在的同类中包含 C1、C2、C3,则 !C1,代表 C2 或 C3 选择其中一个
需求
- 在用户选配时,当表达式触发时候,要提供必要校验
- 依赖:提交时,表达式触发,但不满足,必填提示
- 互斥:选择过程中,当表达式满足,互斥提示
- 问题提示:展示表达式,绿色-选中项、橙色-互斥项、灰色-未选中项、红色-当前选择项
原始数据
- 表达式数据
{ relType, // 依赖/互斥 String relDire, // 单向/双向 String dist, // 干扰源 Array src, // 目标源 Array } 复制代码
- 源数据
[ { join, // 且-2、或-1 non, // 非-1、与-0 parenthesis, // (-1 、)-2 } ] 复制代码
实现思路
- 数据结构化
- 且/或
- 且:用集合表示,Set
- 或:用数组表示,Array
- (A || B) && C
- 为方便展示,内层代表Set,外层代表Array
[[A, C],[B, C]]
- 非的情况处理
- 余下同类项或
- (B || !C1) && D
- !C1 =>
[C2, C3]
[[B, D],[C2, D], [C3, D]]
- 括号
- 同上述示例,最终展开
- 双向/单项
- 用字典处理 Map
- 双向依赖展成两个单向分别推入字典中
- 双向互斥可按照单向互斥处理
- 且/或
- 结构化数据算法
- 切或非
- 数据处理后,进行扁平化处理
- 括号
- 参考计算器算法处理即可
- 切或非
- 匹配算法思路
- 利用集合Set
- 已选中选项与源展开数据中的每个且的集合中的选项组成新的集合,新集合长度等于已选中选型数量,即为触发
[match1, match2, ...]
new Set([...selects, ...match[n]])
- 展示
- 即可按照常规前端UI实现
效果
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END