记一次业务场景中使用数据结构与算法解决需求问题的思路 —— 依赖互斥

场景介绍

  • 在选配业务中一组配件(干扰源)与另一组配件(目标源)之间存在单向双向依赖互斥的情况,
  • 细节
    • 选择配件时没有先后顺序
    • 一类配件中可以是单选或者多选
    • 触发:单向情况必须满足左侧干扰源条件才为触发,双向满足一个源即为触发
    • 满足:即左右两个条件均满足
  • 表达式示例
    • 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实现

效果

image.png

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享