视频扑克应用中判断两对(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); }
逻辑说明
- 使用
reduce统计每个牌面等级(rank)的出现次数,用(acc[card.rank] || 0) + 1简化了原有的判断逻辑 - 通过
Object.values取出所有次数,筛选出等于2的项并统计长度 - 两对的核心条件是恰好有2个不同的rank各出现2次,额外排除四条情况(避免和高优先级获胜逻辑冲突)
- 函数明确返回布尔值,避免未匹配时返回
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
相关产品推荐
相关产品推荐

