从嵌套对象提取moduleName关联路径并映射对应值(忽略首键)
需求与实现方案
原始对象定义
export const sectionsTree: SectionRoot = { [RouteEnum.PROJECTS]: { [SubRouteEnum.EMPTY]: { moduleName: ModuleEnum.ProjectsList, onAction: { [ActionEnum.SELECT_PROJECT]: ModuleEnum.ActiveProjectFormsList } }, [SubRouteEnum.PARAM_PROJECT_ID]: { [SubRouteEnum.FORMS]: { moduleName: ModuleEnum.ActiveProjectFormsList, displayAsTabView: true, onAction: { [ActionEnum.SELECT_PROJECT_FORM]: ModuleEnum.ActiveProjectForm }, [SubRouteEnum.PARAM_FORM_ID]: { moduleName: ModuleEnum.ActiveProjectForm } }, [SubRouteEnum.ATTRIBUTES]: { moduleName: ModuleEnum.ActiveProjectAttributesList, displayAsTabView: true, onAction: { [ActionEnum.SELECT_PROJECT_ATTRIBUTE]: ModuleEnum.ActiveProjectAttribute }, [SubRouteEnum.PARAM_ATTRIBUTE_ID]: { moduleName: ModuleEnum.ActiveProjectAttribute } } } }, [RouteEnum.MEASUREMENTS_UNITS]: { [SubRouteEnum.EMPTY]: { moduleName: ModuleEnum.MeasurementUnitsTable, onAction: { [ActionEnum.MANAGE_MEASUREMENT_UNIT]: ModuleEnum.ManageMeasurementUnit } }, [SubRouteEnum.PARAM_MEASUREMENT_UNIT_ID]: { moduleName: ModuleEnum.ManageMeasurementUnit, onAction: { [ActionEnum.SAVE_MEASUREMENT_UNIT]: ModuleEnum.MeasurementUnitsTable } } } };
需求说明
需要从上述sectionsTree对象中提取所有包含moduleName属性的节点路径,将路径与对应的moduleName值配对,最终得到类似{ [ModuleEnum.ActiveProjectAttribute]: ":id/attributes/:attributeid" }的结构。路径可选择移除第一个根键(如RouteEnum.PROJECTS)。
实现代码
// 递归遍历提取路径的函数 function extractModulePaths(tree: any, result: Record<string, string> = {}, currentPath: string[] = []): Record<string, string> { for (const key in tree) { if (Object.prototype.hasOwnProperty.call(tree, key)) { const node = tree[key]; const newPath = [...currentPath, key]; // 找到带moduleName的节点,记录路径(自动移除第一个根键) if (node.moduleName) { const pathSegments = newPath.slice(1); // 去掉第一个根节点 const pathStr = pathSegments.filter(seg => seg).join('/'); result[node.moduleName] = pathStr; } // 递归遍历子节点(跳过onAction这类非路径节点) if (typeof node === 'object' && !('onAction' in node)) { extractModulePaths(node, result, newPath); } } } return result; } // 调用函数获取结果 const modulePathMap = extractModulePaths(sectionsTree);
输出结果
最终得到的对象结构如下:
{ [ModuleEnum.ProjectsList]: '', [ModuleEnum.ActiveProjectFormsList]: ':id/forms', [ModuleEnum.ActiveProjectForm]: ':id/forms/:formid', [ModuleEnum.ActiveProjectAttributesList]: ':id/attributes', [ModuleEnum.ActiveProjectAttribute]: ':id/attributes/:attributeid', [ModuleEnum.MeasurementUnitsTable]: '', [ModuleEnum.ManageMeasurementUnit]: ':unitid' }
内容的提问来源于stack exchange,提问作者user22155061
相关产品推荐
相关产品推荐

