如何在switch-case中匹配多值?及骰子对面数字代码简化
骰子对面数字求解的代码优化问题
问题描述
给定一个标准6面立方体骰子(每个面印有1至6的数字),输入骰子的一个面数字N,需求解其对面的数字。示例:输入N=6,输出1(数字6的对面是1)。
我通过常规switch-case逐一判断6个面的数字并返回对应对面数字,代码通过了测试用例,但希望简化代码。同时想请教:如何在switch-case语句中同时检查两个值?
现有实现代码
oppositeFaceOfDice(N) { //code here switch(N){ case 1:return 6; break; case 6:return 1; break; case 2:return 5; break; case 5:return 2; break; case 3:return 4; break; case 4:return 3; break; default: return -1; } }
我尝试的简化代码
oppositeFaceOfDice(N) { switch(N){ case 1||6 : return 6?1:6; break; case 2||5: return 2?5:2; break; case 3||4: return 4?3:4; break; } }
解答
1. 你尝试的简化代码存在的问题
case 1||6写法错误:1||6是逻辑表达式,结果为1,所以这个case只会匹配N=1,无法匹配N=6,同理其他case也只能匹配前一个数字。return 6?1:6逻辑错误:6是真值,这个表达式永远返回1,无法根据输入的N返回对应对面数字。
2. 最简洁的实现方式
利用标准骰子对面数字之和为7的特性,一行代码就能解决:
oppositeFaceOfDice(N) { return (N >= 1 && N <= 6) ? 7 - N : -1; }
这个写法既简洁高效,又保留了对无效输入返回-1的判断。
3. 坚持用switch-case的正确简化写法
可以利用switch的case穿透特性,让同一个逻辑处理多个值:
oppositeFaceOfDice(N) { switch(N){ case 1: case 6: return N === 1 ? 6 : 1; case 2: case 5: return N === 2 ? 5 : 2; case 3: case 4: return N === 3 ? 4 : 3; default: return -1; } }
当N匹配case 1时,因为没有break,会继续执行case 6后的代码,从而同时处理1和6的情况。
4. switch-case中同时检查两个变量的方法
switch本质是匹配表达式的结果,因此可以将两个变量组合成一个可匹配的表达式(比如字符串):
function checkTwoVars(a, b) { switch (`${a},${b}`) { case '1,6': case '6,1': console.log("这两个数字是骰子的对面"); break; case '2,5': case '5,2': console.log("这两个数字是骰子的对面"); break; default: console.log("这两个数字不是对面"); } }
如果是判断两个变量满足某种条件,用if-else通常更直观,但如果一定要用switch,就需要构造一个能唯一标识组合情况的表达式来匹配。
内容的提问来源于stack exchange,提问作者Avon K
相关产品推荐
相关产品推荐

