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

请求优化高尔夫计分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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 15:17:46