• js设计模式:组合模式


    作用:

    可以用来将数据组合成树形的数据,可以像操作单独的对象一样去操作整个树形结构

    树是相对复杂的数据,使用组合模式去封装树形的组件,是很重要的,可以对外暴露很多树的操作方法

    示例:

    1. //一个树型的对象数据
    2. class Organ {
    3. constructor(label, value, parentName) {
    4. this.label = label
    5. this.value = value
    6. this.parentName = parentName
    7. this.childRen = []
    8. }
    9. }
    10. //新增元素
    11. Organ.prototype.addChildRen = function () {
    12. let arr = Array.from(arguments)
    13. arr.forEach(item => {
    14. this.childRen.push(item)
    15. this.flatList.push([this.value,item.value])
    16. })
    17. this.changeTreeNodeList()
    18. }
    19. //删除某个元素,其子节点也都会被一并删除
    20. Organ.prototype.removeChildRen = function (nodeValue) {
    21. let index = this.childRen.findIndex(val => val.value === nodeValue)
    22. this.childRen.splice(index,1)
    23. let arr = this.flatList.map(item=>{
    24. if(!item.includes(nodeValue)){
    25. return item
    26. }
    27. })
    28. this.flatList = arr.filter(item => item !== undefined)
    29. this.changeTreeNodeList()
    30. }
    31. //过滤生成树的各条节点路线
    32. Organ.prototype.changeTreeNodeList = function(){
    33. this.treeNodeList.length = 0
    34. this.flatList.forEach(item1=>{
    35. let obj = this.flatList.find(item2 => item2[item2.length-1] === item1[0])
    36. if(obj){
    37. this.treeNodeList.push([... new Set([].concat(obj).concat(item1))])
    38. }
    39. })
    40. }
    41. Organ.prototype.flatList = []
    42. Organ.prototype.treeNodeList = []
    43. //创建父级组织
    44. const jituanjun1 = new Organ('第一集团军','jituanjun1',false)
    45. //创建子级组织
    46. const hechenglv1 = new Organ('合成1旅','hechenglv1','jituanjun1')
    47. const hechenglv2 = new Organ('合成2旅', 'hechenglv2','jituanjun1')
    48. //子级组织加入父级组织
    49. jituanjun1.addChildRen(hechenglv1, hechenglv2)
    50. //下面操作重复上面的操作
    51. const bubingying1 = new Organ('步兵1营', 'bubingying1','hechenglv1')
    52. const bubingying2 = new Organ('步兵2营', 'bubingying2','hechenglv1')
    53. hechenglv1.addChildRen(bubingying1,bubingying2)
    54. const bubingying3 = new Organ('步兵3营', 'bubingying3','hechenglv2')
    55. const bubingying4 = new Organ('步兵4营', 'bubingying4','hechenglv2')
    56. hechenglv2.addChildRen(bubingying3,bubingying4)
    57. const bubingying5 = new Organ('步兵5营', 'bubingying5','hechenglv2')
    58. hechenglv2.addChildRen(bubingying5)
    59. //撤编
    60. hechenglv2.removeChildRen('bubingying4')
    61. console.log(jituanjun1,'第一集团军编制')
    62. console.log(jituanjun1.treeNodeList,'树的所有完整节点流向')

  • 相关阅读:
    网络服务ftp实验
    【KAWAKO】从mac上定时将腾讯云的数据备份到本地
    Springboot健身房管理系统毕业设计源码031807
    一起Talk Android吧(第三百七十二回:Timer的陷阱)
    adb shell执行定时2小时命令
    初探Git:理解和使用版本控制的魔法
    RabbitMQ如何保证消息不丢
    Vue3 setup函数的使用
    maven如何手动添加jar包到本地仓库
    (1)(1.16) Maxbotix I2C声纳
  • 原文地址:https://blog.csdn.net/m0_54741495/article/details/136182611