将if判断改写为switch case后函数返回值异常是什么原因?
问题原因
你的switch case代码缺失了每个分支的break语句,触发了switch的穿透执行特性:当匹配到第一个符合条件的case后,程序不会自动跳出switch结构,会依次执行后续所有case的代码逻辑。
你调用validate('smsCode')时的执行流程是:
- 匹配到
case 'smsCode',key被赋值为code - 没有break,继续执行
case 'phoneMobile'逻辑,key被赋值为phoneNumber - 没有break,继续执行
case 'passport'逻辑,key被赋值为ssn - 没有break,继续执行
case 'comment'逻辑,key被赋值为notes - switch执行结束,最终返回
notes
修复方案
方案1:为每个case添加break语句
transpileKey = key => { switch (key) { case 'smsCode': key = 'code'; break; case 'phoneMobile': key = 'phoneNumber'; break; case 'passport': key = 'ssn'; break; case 'comment': key = 'notes'; break; // 没有匹配的case时不修改key,直接返回原值 default: break; } return key; };
方案2:使用对象映射实现(更推荐,可读性、扩展性更好)
如果后续需要新增更多key的转译规则,直接在映射对象里加键值对即可,逻辑更简洁:
// 预先定义key的映射规则 const KEY_TRANSPILE_MAP = { smsCode: 'code', phoneMobile: 'phoneNumber', passport: 'ssn', comment: 'notes' } // 转译逻辑:匹配到映射就返回转译后的值,没匹配到返回原值 transpileKey = key => KEY_TRANSPILE_MAP[key] ?? key;
内容的提问来源于stack exchange,提问作者flow24
相关产品推荐
相关产品推荐

