请求优化高尔夫计分JavaScript代码:如何实现更简洁写法?
更简洁的高尔夫分数计算函数实现
嘿,你写的这个功能逻辑完全没问题,但确实可以用更优雅简洁的方式来实现——核心是利用击球数和标准杆的差值,直接映射到你定义的names数组索引,彻底摆脱一堆if-else分支的繁琐。
你的原代码通过逐个判断条件返回对应结果,逻辑清晰但冗余度高,当规则有调整时需要修改多个分支,维护成本略高。下面给你几个优化方案:
方案一:三元运算符简化条件判断
用链式三元组替代else if,让逻辑更紧凑:
const names = ["Hole-in-one!", "Eagle", "Birdie", "Par", "Bogey", "Double Bogey", "Go Home!"]; function golfScore(par, strokes) { if (strokes === 1) return names[0]; const diff = strokes - par; return names[ diff <= -2 ? 1 : diff === -1 ? 2 : diff === 0 ? 3 : diff === 1 ? 4 : diff === 2 ? 5 : 6 ]; }
方案二:数学映射直接计算索引(最简洁)
仔细观察规则你会发现:Par对应数组的索引3,而strokes - par的差值刚好是索引的偏移量——比如比标准杆少2杆(diff=-2),索引就是3-2=1(对应Eagle);比标准杆多3杆(diff=3),索引就是3+3=6(对应Go Home!)。我们只需要把计算出的索引限制在1到6的范围内,就能覆盖所有非一杆进洞的情况:
const names = ["Hole-in-one!", "Eagle", "Birdie", "Par", "Bogey", "Double Bogey", "Go Home!"]; function golfScore(par, strokes) { if (strokes === 1) return names[0]; const diff = strokes - par; // 用Math.max和Math.min把索引限制在1-6的有效区间内 const index = Math.max(1, Math.min(6, 3 + diff)); return names[index]; }
如果追求极致简洁,还可以写成一行箭头函数(可读性依然在线):
const names = ["Hole-in-one!", "Eagle", "Birdie", "Par", "Bogey", "Double Bogey", "Go Home!"]; const golfScore = (par, strokes) => strokes === 1 ? names[0] : names[Math.max(1, Math.min(6, 3 + strokes - par))];
这种方式的好处是逻辑高度凝练,不需要写一堆重复的条件判断,维护起来也更方便——只要names数组的顺序不变,哪怕规则细节调整,只需要修改索引计算逻辑即可。而且时间复杂度是O(1),比遍历数组判断的效率更高。
其实你一开始想简化的方向是对的,只是没发现差值和数组索引的对应关系。这种利用数值映射减少条件分支的技巧,在处理这类规则明确的场景时特别实用,多练几次就能形成思维习惯啦~
内容的提问来源于stack exchange,提问作者AndyFandy
相关产品推荐
相关产品推荐

