js设计模式:组合模式

作用:

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

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

示例:

javascript 复制代码
        //一个树型的对象数据
        class Organ {
            constructor(label, value, parentName) {
                this.label = label
                this.value = value
                this.parentName = parentName
                this.childRen = []
            }
        }
        //新增元素
        Organ.prototype.addChildRen = function () {
            let arr = Array.from(arguments)
            arr.forEach(item => {
                this.childRen.push(item)
                this.flatList.push([this.value,item.value])
            })
            this.changeTreeNodeList()
        }
        //删除某个元素,其子节点也都会被一并删除
        Organ.prototype.removeChildRen = function (nodeValue) {
            let index = this.childRen.findIndex(val => val.value === nodeValue)
             this.childRen.splice(index,1)
             let arr = this.flatList.map(item=>{
                if(!item.includes(nodeValue)){
                    return item
                }
             })
            this.flatList = arr.filter(item => item !== undefined)
            this.changeTreeNodeList()
        }
        //过滤生成树的各条节点路线
        Organ.prototype.changeTreeNodeList = function(){
            this.treeNodeList.length = 0
            this.flatList.forEach(item1=>{
                let obj = this.flatList.find(item2 => item2[item2.length-1] === item1[0])
                if(obj){
                  this.treeNodeList.push([... new Set([].concat(obj).concat(item1))])
                }
            })
        }
        Organ.prototype.flatList = []
        Organ.prototype.treeNodeList = []

        //创建父级组织
        const jituanjun1 = new Organ('第一集团军','jituanjun1',false)
        //创建子级组织
        const hechenglv1 = new Organ('合成1旅','hechenglv1','jituanjun1')
        const hechenglv2 = new Organ('合成2旅', 'hechenglv2','jituanjun1')
        //子级组织加入父级组织
        jituanjun1.addChildRen(hechenglv1, hechenglv2)

        //下面操作重复上面的操作
        const bubingying1 = new Organ('步兵1营', 'bubingying1','hechenglv1')
        const bubingying2 = new Organ('步兵2营', 'bubingying2','hechenglv1')
        hechenglv1.addChildRen(bubingying1,bubingying2)
        const bubingying3 = new Organ('步兵3营', 'bubingying3','hechenglv2')
        const bubingying4 = new Organ('步兵4营', 'bubingying4','hechenglv2')
        hechenglv2.addChildRen(bubingying3,bubingying4)
        const bubingying5 = new Organ('步兵5营', 'bubingying5','hechenglv2')
        hechenglv2.addChildRen(bubingying5)

        //撤编
        hechenglv2.removeChildRen('bubingying4')
        console.log(jituanjun1,'第一集团军编制')
        console.log(jituanjun1.treeNodeList,'树的所有完整节点流向')
相关推荐
Csvn1 小时前
运行时性能
前端
Never_every992 小时前
位图转矢量工具哪个好?实测抠抠图AI位图转矢量工具
大数据·前端
paopaokaka_luck2 小时前
宠物门店经营管理系统(销售与库存联动、进货自动记账、 退换与退款关联、员工个人业绩、ECharts 经营分析、滞销识别与客户分层、宠物档案年龄计算)
前端·javascript·spring boot·mysql·echarts·mybatis·1024程序员节
空中湖3 小时前
用 React 写数据大屏:为什么我不建议用图表库
前端·react.js·前端框架
欣欣之王来了5 小时前
原始HTML插值:v-html指令的使用与安全风险
前端·学习·架构·项目·vue3教程
IT_陈寒5 小时前
Redis的LRU淘汰策略坑了我一整天
前端·人工智能·后端
计算机魔术师5 小时前
砍半价格、参数再涨,国产旗舰追到 Opus 鼻尖了
前端
特立独行的猫A5 小时前
10 MB 的桌面 AI 客户端:用仓颉 + 系统 WebView 替代 Electron
前端·harmonyos
修炼的dance6 小时前
白底图存JPG,sharp开mozjpeg背景杂点少近三成
前端
anOnion6 小时前
构建无障碍组件之Grid Pattern
前端·html·交互设计