You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

从嵌套对象提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 13:20:03