三路十八湾 2023-02-20 14:44 采纳率: 50%
浏览 160
已结题

关于#树结构循环#的问题,如何解决?

碰到循环树结构问题

需求是传入一个id,例如:B3OCM,通过循环得到只包含B3OCM的树结构:同时单板级和之前节点的不变
请注意! 此段树结构要寻找的 boardId 是数组内包多个id


const BoardMenus = [
    {
        key: '/neConfig/dvm/Spec/SystemConfiguration',
        display: ['System Configuration', '配置管理'],
        children: [
            {
                key: '/Subrack',
                display: ['Subrack', '单板级'],
                children: [
                    {
                        key: '/Configuration',
                        display: ['Configuration', '配置'],
                        children: [
                            {
                                key: '/WDM_Interface/WDMInterface', display: ['WDM Interface', 'WDM接口'],
                                boardId: ['B3OCM', 'B3PDU'],
                                type: '1'
                            },
                            {
                                key: '/Optical_Power_Management/OpticalPowerManagement', display: ['Optical Power Management', '光功率管理'],
                                boardId: ['B3PDU', 'B3OCM'],
                                type: '1'
                            },
                            {
                                key: '/Environment_Monitor', display: ['Environment Monitor', '环境监视配置'],
                                children: [
                                    {
                                        key: '/Environment_Monitor_Interface/Monitor_Interface', display: ['Environment Monitor Interface', '环境监视接口'],
                                        boardId: ['B3PDU', 'B3OCM'],
                                        type: '1'
                                    }
                                ]
                            },
                            {
                                key: '/Flexgrid_Monitor_Wavelength/FlexgridMonitorWavelength', display: ['Flexgrid Monitor Wavelength', 'Flexgrid监控器波长'],
                                boardId: ['B3LDU'],
                                type: '1'
                            },
                            {
                                key: '/Threshold_Management/ThresholdManagement', display: ['Threshold Management', '阈值管理'],
                                boardId: ['B3LDU'],
                                type: '1'
                            },
                        ]
                    },
                    {
                        key: '/Alarm',
                        display: ['Board Alarm', '告警'],
                        children: [
                            {
                                key: '/Alarm_Severity_Auto/AlarmSeverityAuto', display: ['Alarm Severity Auto', '告警级别和自动上报设置'],
                                boardId: ['B3OCM', 'B3PDU'],
                                type: '2'
                            },
                            { key: '/Alarm_Suppression/AlarmSuppression', display: ['Alarm Suppression', '告警抑制'] },
                            { key: '/Alarm_Reversion/AlarmReversion', display: ['Alarm Reversion', '告警恢复'] },

                        ]
                    },
                    {
                        key: '/Performance',
                        display: ['Subrack Performance', '性能'],
                        children: [
                            {
                                key: '/CurrentPerformance', display: ['Current Performance', '当前性能'],
                                boardId: ['B3OCM', 'B3LDU', 'B3PDU'],
                                type: '3'
                            },
                        ],
                    },

                ],
            },
        ]
    }

]

如果传入上面树结构 并且传入id B3OCM

想要得到的结构是这样的


const Menus = [
    {
        key: '/neConfig/dvm/Spec/SystemConfiguration',
        display: ['System Configuration', '配置管理'],
        children: [
            {
                key: '/Subrack',
                display: ['Subrack', '单板级'],
                children: [
                    {
                        key: '/Configuration',
                        display: ['Configuration', '配置'],
                        type: '1',
                        children: [
                            {
                                key: '/WDM_Interface/WDMInterface', display: ['WDM Interface', 'WDM接口'],
                                boardId: ['B3OCM', 'B3PDU'],
                                type: '1'
                            },
                            {
                                key: '/Optical_Power_Management/OpticalPowerManagement', display: ['Optical Power Management', '光功率管理'],
                                boardId: ['B3PDU', 'B3OCM'],
                                type: '1'
                            },
                            {
                                key: '/Environment_Monitor', display: ['Environment Monitor', '环境监视配置'],
                                children: [
                                    {
                                        key: '/Environment_Monitor_Interface/Monitor_Interface', display: ['Environment Monitor Interface', '环境监视接口'],
                                        boardId: ['B3PDU', 'B3OCM'],
                                        type: '1'
                                    }
                                ]
                            },
                        ]
                    },
                    {
                        key: '/Alarm',
                        display: ['Board Alarm', '告警'],
                        type: '2',
                        children: [
                            {
                                key: '/Alarm_Severity_Auto/AlarmSeverityAuto', display: ['Alarm Severity Auto', '告警级别和自动上报设置'],
                                boardId: ['B3OCM', 'B3PDU'],
                                type: '2'
                            },
                        ]
                    },
                    {
                        key: '/Performance',
                        display: ['Subrack Performance', '性能'],
                        type: '3',
                        children: [
                            {
                                key: '/CurrentPerformance', display: ['Current Performance', '当前性能'],
                                boardId: ['B3OCM', 'B3LDU', 'B3PDU'],
                                type: '3'
                            },
                        ],
                    },

                ],
            },
        ]
    }
]
  • 写回答

10条回答 默认 最新

  • {关山难越} 2023-02-20 15:51
    关注

    这个问题看起来需要对 BoardMenus 数组进行递归遍历,找到包含特定 boardId 的节点,并且保留其祖先节点的信息。以下是一个可能的实现方式:

    function filterBoardMenusById(menus, targetId) {
      return menus.filter(menu => {
        if (menu.children) {
          menu.children = filterBoardMenusById(menu.children, targetId);
        }
        if (menu.boardId && menu.boardId.includes(targetId)) {
          delete menu.boardId; // 删除目标节点的 boardId 属性
          return true;
        }
        return menu.children && menu.children.length > 0;
      });
    }
    
    // 例如,查找包含 B3OCM 的树结构
    const targetId = 'B3OCM';
    const Menus = filterBoardMenusById([...BoardMenus], targetId);
    

    这里的 filterBoardMenusById 函数接收一个数组参数 menus 和一个字符串参数 targetId,返回一个新的数组。它会先对 menus 进行过滤,对于每个元素:
    如果有 children 属性,递归调用 filterBoardMenusById 并更新 children 属性。
    如果有 boardId 属性,检查其是否包含 targetId,如果是则删除该属性并返回 true。
    如果都不符合,则检查是否有子节点,并且子节点个数大于 0,如果是则返回 true。
    最终返回的新数组就是符合条件的树结构。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(9条)

报告相同问题?

问题事件

  • 系统已结题 3月1日
  • 已采纳回答 2月21日
  • 修改了问题 2月20日
  • 修改了问题 2月20日
  • 展开全部

悬赏问题

  • ¥50 Dkeil5 CT107D单片机的程序编写
  • ¥30 Ubuntu20.04中PVN3D复现过程交叉编译问题
  • ¥15 模拟电路求复阻抗和传递函数,请各位拍照写一下解答过程
  • ¥60 不懂得怎么运行下载来的代码
  • ¥15 CST导出3D模型图为什么和软件显示不一样?
  • ¥15 加热反应炉PLC控制系统设计(相关搜索:梯形图)
  • ¥15 python 用Dorc包报错,我的写法和网上教的是一样的但是它显示无效参数,是什么问题
  • ¥15 经过滑动平均后的一维信号还原用什么结构好呢?
  • ¥15 指定IP电脑的访问设置
  • ¥30 matlab ode45 未发现警告,但是运行出错