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

如何优化Vanilla JavaScript中2000+行的薪资个税计算函数?

薪资个税计算器臃肿函数优化方案

问题背景

我正在基于本国官方数据开发薪资个税计算器,但现有核心函数过于臃肿:包含约500个if语句,每个if下还有290个case分支,代码冗余且难以维护。需要优化实现以下目标:

  1. 精简代码,消除冗余
  2. 提升可扩展性,方便适配明年的新个税数据

原函数示例:

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 10:16:04