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

如何优化JavaScript/TypeScript中的嵌套if-else为switch或更可读写法?

代码优化方案:替换嵌套if-else,提升可读性

问题背景

我最初尝试用switch语句实现业务逻辑,但发现switch的case不能使用布尔表达式(比如case countries.includes('France')不符合语法),于是改用嵌套if-else实现,但代码层级深、扩展性差。

现有两个数组:

const countries = [ 'France', 'Italy', 'Spain' ];
const cities = [ 'Paris', 'Marseille', 'Rome', 'Naples', 'Milan', 'Madrid' ];

关联规则与业务逻辑

  • 国家与城市对应关系:
    • France → Paris、Marseille
    • Italy → Rome、Naples、Milan
    • Spain → Madrid
  • 执行逻辑:
    1. 按字母顺序(France > Italy > Spain)优先检查传入的国家数组
    2. 若匹配到国家但传入的城市数组为空,默认使用对应国家的首都(对应列表第一个城市)
    3. 若有多个可选城市,优先选择对应列表中最后一个在传入城市数组里存在的城市

示例

  • 输入:countries = [ 'France' ]; cities = [ 'Marseille'] → 输出:doThat('Marseille');
  • 输入:countries = [ 'France' ]; cities = [] → 输出:doThat('Paris');
  • 输入:countries = [ 'France' ]; cities = [ 'Paris', 'Marseille'] → 输出:doThat('Marseille');

原实现代码

const doThat = (city: string) => {
  console.log(city);
};

const myFunc = (countries: string[], cities: string[]) => {
  if (countries.includes('France')) {
    if (cities.includes('Marseille')) {
      doThat('Marseille');
    } else doThat('Paris');
  } else if (countries.includes('Italy')) {
    if (cities.includes('Naples')) {
      doThat('Naples');
    } else if (cities.includes('Milan')) {
      doThat('Naples');
    } else doThat('Rome');
  } else if (countries.includes('Spain')) {
    doThat('Madrid');
  } else doThat('empty');
};

优化方案:用配置对象解耦规则与逻辑

核心思路是把国家的关联规则、优先级等数据从逻辑代码中抽离,用配置对象统一管理,让逻辑代码更通用、易维护。

步骤1:定义统一配置

按国家检查顺序,把每个国家的城市优先级(从低到高)、首都信息整理成配置数组:

// 配置数组:按检查顺序排列,每个项包含国家名、城市优先级列表、首都
const countryConfigs = [
  {
    name: 'France',
    cityPriority: ['Paris', 'Marseille'], // 优先级:Marseille > Paris
    capital: 'Paris'
  },
  {
    name: 'Italy',
    cityPriority: ['Rome', 'Milan', 'Naples'], // 优先级:Naples > Milan > Rome
    capital: 'Rome'
  },
  {
    name: 'Spain',
    cityPriority: ['Madrid'],
    capital: 'Madrid'
  }
];

注:如果要保留原代码中Italy的特殊逻辑(只要存在Milan就返回Naples),可将Italy的配置改为:

{
  name: 'Italy',
  priorityCity: 'Naples',
  triggerCities: ['Naples', 'Milan'], // 只要存在这些城市中的任意一个,就返回priorityCity
  capital: 'Rome'
}

后续逻辑对应调整即可。

步骤2:编写通用逻辑

遍历配置数组找到第一个匹配的国家,再根据配置筛选目标城市:

const doThat = (city: string) => {
  console.log(city);
};

const myFunc = (countries: string[], cities: string[]) => {
  // 找到第一个符合条件的国家(按配置顺序)
  const matchedCountry = countryConfigs.find(config => countries.includes(config.name));
  
  if (!matchedCountry) {
    doThat('empty');
    return;
  }

  // 筛选出传入城市数组中存在的当前国家城市
  const availableCities = matchedCountry.cityPriority.filter(city => cities.includes(city));
  
  // 取最高优先级城市(数组最后一项),无匹配则用首都
  const targetCity = availableCities.length > 0 ? availableCities.at(-1)! : matchedCountry.capital;
  
  doThat(targetCity);
};

优化后的优势

  1. 可读性提升:规则集中在配置对象,逻辑与数据分离,一眼就能看懂每个国家的优先级设置
  2. 扩展性增强:新增国家或修改城市规则时,只需修改配置数组,无需改动核心逻辑
  3. 代码更简洁:去掉多层嵌套if-else,逻辑线性化,降低维护成本

内容的提问来源于stack exchange,提问作者Leo Messi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 17:18:11