JS中多case共用结果的switch语句的更优替代实现方案
JS中替代多Case同结果Switch语句的优化写法
在JS里,用对象查找替代switch-case是很常用的优化手段,比如下面的示例:
常规switch写法
function phoneticLookup(val) { var result = ""; switch(val) { case "alpha": result = "Adams"; break; case "bravo": result = "Boston"; break; case "charlie": result = "Chicago"; break; } return result; }
对象查找替代写法
function phoneticLookup(val) { var result = ""; var lookup = { "alpha": "Adams", "bravo": "Boston", "charlie": "Chicago", }; result = lookup[val]; return result; }
但如果遇到多个case对应同一结果的switch语句(比如下面根据国家匹配大洲的场景),可以用以下几种不用if-else的方式优化:
原switch语句示例
let continent = ''; switch (country) { case "China": case "India": case "Nepal": continent = 'Asia'; break; case "UK": case "France": case "Poland": continent = 'Europe'; break; case "Egypt": case "Zimbave": case "Somalia": continent = 'Africa'; break; default: continent = 'Other' break; }
优化方案
方案一:直接构建国家→大洲的映射对象(推荐,O(1)查找)
这种写法最直观,查找性能最优,代码简洁易维护:
const countryToContinent = { "China": "Asia", "India": "Asia", "Nepal": "Asia", "UK": "Europe", "France": "Europe", "Poland": "Europe", "Egypt": "Africa", "Zimbave": "Africa", "Somalia": "Africa" }; // 用||处理默认值 const continent = countryToContinent[country] || 'Other';
方案二:分组映射+遍历查找(减少重复代码)
如果不想重复书写大洲名称,可以按大洲分组,再通过遍历匹配:
const continentGroups = { "Asia": ["China", "India", "Nepal"], "Europe": ["UK", "France", "Poland"], "Africa": ["Egypt", "Zimbave", "Somalia"] }; // 用find方法快速匹配 const continent = Object.entries(continentGroups) .find(([_, countries]) => countries.includes(country))?.[0] || 'Other';
注:这种写法查找时间复杂度为O(n)(n为大洲分组数量),适合国家数量极多、希望减少代码重复的场景。
方案三:使用Map结构(支持灵活键类型)
如果需要支持非字符串类型的键,或者想避免对象原型链的潜在问题,可以用Map:
const countryContinentMap = new Map([ ["China", "Asia"], ["India", "Asia"], ["Nepal", "Asia"], ["UK", "Europe"], ["France", "Europe"], ["Poland", "Europe"], ["Egypt", "Africa"], ["Zimbave", "Africa"], ["Somalia", "Africa"] ]); const continent = countryContinentMap.get(country) || 'Other';
内容的提问来源于stack exchange,提问作者newbie
相关产品推荐
相关产品推荐

