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

视频扑克应用中判断两对(Two Pair)的函数实现问题

修复视频扑克两对判断逻辑

原函数的问题

  • pairs变量在循环内部声明,每次迭代都会重置为0,永远无法累计到2
  • 定义了sortedHand但未使用,属于冗余代码
  • 没有处理未找到两对的情况,函数会默认返回undefined而非false

正确实现方案

先统计每个牌面的出现次数,然后筛选出次数为2的项,判断数量是否等于2即可:

function isTwoPair() {
  // 统计每个rank的出现次数
  const rankCounts = playerHand.reduce((acc, card) => {
    acc[card.rank] = (acc[card.rank] || 0) + 1;
    return acc;
  }, {});
  
  // 筛选出出现次数为2的rank数量
  const pairCount = Object.values(rankCounts).filter(count => count === 2).length;
  
  // 两对需要恰好两个不同的rank各出现2次,同时排除四条的情况(严谨性考虑)
  return pairCount === 2 && !Object.values(rankCounts).includes(4);
}

逻辑说明

  1. 使用reduce统计每个牌面等级(rank)的出现次数,用(acc[card.rank] || 0) + 1简化了原有的判断逻辑
  2. 通过Object.values取出所有次数,筛选出等于2的项并统计长度
  3. 两对的核心条件是恰好有2个不同的rank各出现2次,额外排除四条情况(避免和高优先级获胜逻辑冲突)
  4. 函数明确返回布尔值,避免未匹配时返回undefined

如果想保留原循环思路,修正后的代码如下:

function isTwoPair() {
  const reduceHand = playerHand.reduce((acc, curVal) => {
    acc[curVal.rank] = (acc[curVal.rank] || 0) + 1;
    return acc;
  }, {});
  
  let pairs = 0;
  // 将pairs变量移到循环外部,才能累计计数
  for (const value of Object.values(reduceHand)) {
    if (value === 2) {
      pairs++;
      // 提前终止循环提升效率
      if (pairs === 2) {
        return true;
      }
    }
  }
  // 未找到两对时返回false
  return pairs === 2;
}

内容的提问来源于stack exchange,提问作者Mundy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:01:00