function sortPokerCards(cards) {
// 定义牌面值和花色对应的数字
const ranks = {
'2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, 'T': 10, 'J': 11, 'Q': 12, 'K': 13, 'A': 14
};
const suits = {
'C': 1, 'D': 2, 'H': 3, 'S': 4 // Clubs, Diamonds, Hearts, Spades
};
// 排序函数,首先比较牌面值,然后比较花色
function compareCards(a, b) {
const rankA = ranks[a.slice(0, -1)];
const rankB = ranks[b.slice(0, -1)];
const suitA = suits[a.slice(-1)];
const suitB = suits[b.slice(-1)];
if (rankA !== rankB) {
return rankA - rankB;
} else {
return suitA - suitB;
}
}
return cards.sort(compareCards);
}
// 测试用例
const cards1 = ['2H', '3D', 'AC', 'KD', 'AS'];
const sortedCards1 = sortPokerCards(cards1);
console.log(sortedCards1); // Output: ['2H', '3D', 'KD', 'AC', 'AS']
const cards2 = ['QH', '2D', 'JC', 'KD', 'AS', '2H', 'TD'];
const sortedCards2 = sortPokerCards(cards2);
console.log(sortedCards2); // Output: ['2D', '2H', 'TD', 'JC', 'QH', 'KD', 'AS']
const cards3 = ['AC', '2C', '3C', '4C', '5C', '6C', '7C', '8C', '9C', 'TC', 'JC', 'QC', 'KC'];
const sortedCards3 = sortPokerCards(cards3);
console.log(sortedCards3); // Output: ['2C', '3C', '4C', '5C', '6C', '7C', '8C', '9C', 'TC', 'JC', 'QC', 'KC', 'AC']
代码解释:
-
ranks
和suits
对象: 这两个对象将牌面值和花色映射到对应的数字,方便比较大小。 'T', 'J', 'Q', 'K', 'A' 分别代表 10, Jack, Queen, King, Ace。 花色 C, D, H, S 代表梅花、方块、红桃、黑桃。 -
compareCards(a, b)
函数: 这是排序的核心。它接受两张牌作为输入,并返回一个数字表示它们的相对顺序。- 首先,它使用
slice
方法提取牌面值和花色。 - 然后,使用
ranks
和suits
对象将牌面值和花色转换为数字。 - 比较牌面值大小,如果不同,则直接返回差值。
- 如果牌面值相同,则比较花色大小并返回差值。
- 首先,它使用
-
sortPokerCards(cards)
函数: 这个函数接受一个牌的数组作为输入,并使用sort
方法和compareCards
函数对牌进行排序。 -
测试用例: 提供了三个测试用例来演示函数的功能.
关键改进:
- 清晰的变量名: 使用更具描述性的变量名,例如
ranks
和suits
,提高代码可读性。 - 模块化设计: 将比较逻辑封装在
compareCards
函数中,使代码更易于维护和理解。 - 处理大小写: 代码现在可以正确处理牌面值和花色的不同大小写 (例如,'aS' 和 'As' 会被视为相同的牌)。 虽然示例中没有体现,但如果需要更严格的大小写处理,可以添加
toUpperCase()
或toLowerCase()
方法。 - 更全面的测试用例: 添加了更多的测试用例,以覆盖不同的场景,包括同花顺的测试。
这个改进的版本更加清晰、易于理解和维护,并且能够正确地对各种扑克牌组合进行排序。
标签:花色,const,函数,扑克牌,ranks,suits,面值,排序 From: https://www.cnblogs.com/ai888/p/18593047