如何获取TypeScript Enum的标签,结合传入枚举值匹配API数据生成数据集
问题根源
你定义的Filtros是字符串枚举,当你传入Filtros[]类型的数组时,每个filtro变量本身就是枚举的value值(比如Filtros.Ligacoes对应的值就是"Ligações"字符串),不存在可以读取的键名属性,而且API返回的字段名和枚举值/键名都不直接匹配,所以需要先建立映射关系。
实现方案
第一步:定义枚举到API字段的映射表
提前建立映射关系,避免运行时做字符串转换出错(比如重音符号、大小写处理异常):
export enum Filtros { Ligacoes = "Ligações", Tempo = "Tempo em chamada (min)", Email = "E-mails enviados", Reuniao = "Reuniões agendadas", } // 枚举值对应API返回的字段名 const FILTRO_TO_API_KEY: Record<Filtros, string> = { [Filtros.Ligacoes]: 'ligações', [Filtros.Tempo]: 'tempo', [Filtros.Email]: 'emails', [Filtros.Reuniao]: 'reuniões', }
第二步:重写数据集生成函数
// 先定义API返回数据的TS类型 interface RawApiItem { nome: string; ligações: number; tempo: number; emails: number; reuniões: number; negocios: number; valorTotal: number; ticketMedio: number; backgroundColor: string; } interface DataSetResult { label: string; data: number[]; } function makeDataSets(filtros: Filtros[], rawApiData: RawApiItem[]): DataSetResult[] { return filtros.map(filtro => { // 直接从映射表取对应API字段 const apiField = FILTRO_TO_API_KEY[filtro]; // 遍历原始数据提取对应字段值 const data = rawApiData.map(item => item[apiField as keyof RawApiItem]); return { label: filtro, data: data } }) }
调用示例
// 假设你从API拿到的原始数据是dataSet const result = makeDataSets([Filtros.Ligacoes, Filtros.Tempo], dataSet);
优化建议
- 不要在函数内部依赖外部变量(比如你原来的
myObj),把原始数据作为参数传入,提高函数复用性和可测试性 - 不要在循环外声明
data变量,避免多次遍历导致数据污染 - 给所有变量加上TS类型定义,提前发现类型错误
- 避免嵌套循环+全量
Object.entries遍历,用预定义映射表直接取值的性能提升非常明显
内容的提问来源于stack exchange,提问作者rafaelpadu
相关产品推荐
相关产品推荐

