如何优化Vanilla JavaScript中2000+行的薪资个税计算函数?
薪资个税计算器臃肿函数优化方案
问题背景
我正在基于本国官方数据开发薪资个税计算器,但现有核心函数过于臃肿:包含约500个if语句,每个if下还有290个case分支,代码冗余且难以维护。需要优化实现以下目标:
- 精简代码,消除冗余
- 提升可扩展性,方便适配明年的新个税数据
原函数示例:
export const getTax = (salary: number, city: string): number => { if (salary >= 1701 && salary <= 1800) { switch (city) { case 'TOKYO': return 126; case 'PARIS': return 136; case 'LONDON': return 145; case 'MADRID': return 193; // 更多城市分支 default: return 112; } } if (salary >= 1801 && salary <= 1900) { switch (city) { case 'TOKYO': return 135; case 'PARIS': return 186; case 'LONDON': return 176; case 'MADRID': return 192; // 更多城市分支 default: return 143; } } // 约500个类似if语句 };
优化方案
1. 数据与逻辑彻底分离
把所有薪资区间、城市税额数据抽离成独立配置,核心逻辑只负责查找匹配,完全消除冗余的if/switch。
配置示例(可单独存为taxConfig.ts文件):
export const taxConfig = [ { minSalary: 1701, maxSalary: 1800, cityTaxes: { TOKYO: 126, PARIS: 136, LONDON: 145, MADRID: 193, DEFAULT: 112 } }, { minSalary: 1801, maxSalary: 1900, cityTaxes: { TOKYO: 135, PARIS: 186, LONDON: 176, MADRID: 192, DEFAULT: 143 } }, // 剩余500个薪资区间配置... ];
2. 重构核心计算函数
遍历配置找到匹配的薪资区间,再根据城市取对应税额:
import { taxConfig } from './taxConfig'; export const getTax = (salary: number, city: string): number => { // 查找匹配的薪资区间 const matchedLevel = taxConfig.find(level => salary >= level.minSalary && salary <= level.maxSalary ); // 处理无匹配区间的情况(可根据业务调整默认值) if (!matchedLevel) return 0; // 返回对应城市税额,无匹配则用默认值 return matchedLevel.cityTaxes[city as keyof typeof matchedLevel.cityTaxes] || matchedLevel.cityTaxes.DEFAULT; };
3. 性能优化:二分查找(可选)
如果薪资区间是有序且连续的,用二分查找替代遍历,大幅提升大数量区间下的查找效率:
import { taxConfig } from './taxConfig'; export const getTax = (salary: number, city: string): number => { let left = 0; let right = taxConfig.length - 1; let matchedLevel = null; // 二分查找匹配区间 while (left <= right) { const mid = Math.floor((left + right) / 2); const level = taxConfig[mid]; if (salary >= level.minSalary && salary <= level.maxSalary) { matchedLevel = level; break; } else if (salary > level.maxSalary) { left = mid + 1; } else { right = mid - 1; } } if (!matchedLevel) return 0; return matchedLevel.cityTaxes[city as keyof typeof matchedLevel.cityTaxes] || matchedLevel.cityTaxes.DEFAULT; };
4. 扩展性保障
- 明年更新个税数据时,仅需修改
taxConfig配置文件,无需改动核心逻辑 - 新增/删除城市时,只需在各区间的
cityTaxes中增删键值对 - 若需动态更新数据,可将配置转为JSON文件或从后端接口拉取,实现无代码更新
内容的提问来源于stack exchange,提问作者Weblurk
相关产品推荐
相关产品推荐

