当前位置:   article > 正文

js设计模式:组合模式

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,'树的所有完整节点流向')

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/138081
推荐阅读
  

闽ICP备14008679号