简化TypeScript多分支if-else语句的方案咨询
简化冗长的月份翻译映射逻辑
这种一长串的if-else分支确实既冗余又难维护,结合你的技术栈,咱们可以用映射对象的方式彻底简化这段代码,同时还能提升可读性和扩展性。下面给你几个实用的方案:
方案1:基础映射对象(最直观)
首先定义一个英文月份到i18n翻译标识的映射表,把所有对应关系集中管理,然后直接通过键值对查找替换:
// 集中定义月份与翻译标识的映射关系 const monthTranslationMap: Record<string, string> = { January: this.JAN, February: this.FEB, March: this.MAR, April: this.APR, May: this.MAY, June: this.JUN, July: this.JUL, August: this.AUG, September: this.SEP, October: this.OCT, November: this.NOV, December: this.DEC }; // 简化遍历逻辑:只处理字符串类型的月份,跳过数值(比如金额) Object.values(data.details.data1).forEach(item => { if (typeof item === 'string' && monthTranslationMap[item]) { xAxisTranslatedArray.push(monthTranslationMap[item]); } });
为什么这更好?
- 所有映射关系一目了然,后续修改/新增月份只需要调整映射表,不用动遍历逻辑
- 避免了大量重复的条件判断,减少出错概率
- 加了类型判断,过滤掉
monthToDate这类数值,避免无效判断
方案2:结合Lodash更高效处理
如果想用Lodash简化数据筛选和转换,可以先提取出需要的月份字符串,再批量映射:
import _ from 'lodash'; // 先从data1中筛选出所有字符串类型的月份值 const targetMonths = _.filter(Object.values(data.details.data1), _.isString); // 批量转换并推入数组(用扩展运算符更简洁) xAxisTranslatedArray.push(..._.map(targetMonths, month => monthTranslationMap[month]));
方案3:精准提取目标字段(最优性能)
观察你的JSON结构,data1里只有firstLastMonth和secondLastMonth是需要翻译的月份字段,其他都是数值。与其遍历所有值,不如直接提取这两个字段,性能更优:
// 直接获取需要翻译的两个月份 const monthsToTranslate = [ data.details.data1.firstLastMonth, data.details.data1.secondLastMonth ]; // 批量映射 monthsToTranslate.forEach(month => { xAxisTranslatedArray.push(monthTranslationMap[month]); });
这个方案完全避免了遍历无关数据,逻辑最清晰,也最适合你给Highcharts X轴提供数据的场景。
内容的提问来源于stack exchange,提问作者chewi
相关产品推荐
相关产品推荐

