JS实现按Points排序、Net Runs决胜的板球数据处理问题
板球队排序与结果生成问题
问题描述
现有cricketMania对象存储了各国家板球队的净胜分(netRuns)和积分(points)数据,需求如下:
- 先按积分对球队排序,积分相同则按净胜分降序排列(净胜分更高的队伍排前)
- 生成结果数组:积分唯一的队伍保留积分,积分重复的队伍替换为对应净胜分
- 符合规则的正确输出:
['3', '-0.849', '-1.176', '5', '6', '8'](注:原给出的目标数组排序逻辑存在矛盾,此为按规则生成的合理结果)
原代码仅实现了积分的升序排序,但未关联净胜分数据,无法完成同积分项的替换。
解决方案代码
const cricketMania = { India: { netRuns: "1.319", points: "8" }, Pakistan: { netRuns: "1.028", points: "6" }, Saudi: { netRuns: "0.874", points: "5" }, Nepal: { netRuns: "-0.849", points: "4" }, Bangladesh: { netRuns: "-1.176", points: "4" }, Zimbabwe: { netRuns: "-1.138", points: "3" } }; // 1. 提取所有球队的完整数据,保留积分与净胜分的关联 const teams = Object.values(cricketMania); // 2. 按规则排序:先积分升序,积分相同则净胜分降序 teams.sort((a, b) => { const pointDiff = Number(a.points) - Number(b.points); if (pointDiff !== 0) { return pointDiff; } // 净胜分降序排列,确保分高的队伍靠前 return Number(b.netRuns) - Number(a.netRuns); }); // 3. 统计每个积分的出现次数,用于判断是否替换为净胜分 const pointCounts = {}; teams.forEach(team => { const p = team.points; pointCounts[p] = (pointCounts[p] || 0) + 1; }); // 4. 生成最终结果数组 const result = teams.map(team => { return pointCounts[team.points] > 1 ? team.netRuns : team.points; }); console.log(result); // 输出: ['3', '-0.849', '-1.176', '5', '6', '8']
代码说明
- 转换数组:使用
Object.values()提取球队完整数据,避免丢失积分与净胜分的对应关系 - 排序逻辑:
- 将积分转为数字后按升序排序(若需降序可改为
Number(b.points) - Number(a.points)) - 积分相同时,将净胜分转为数字按降序排序,保证净胜分更高的队伍排在前面
- 将积分转为数字后按升序排序(若需降序可改为
- 统计积分次数:遍历排序后的数组,记录每个积分的出现次数,用于判断是否需要替换为净胜分
- 生成结果:对每个队伍,若积分重复则取净胜分,否则保留积分
内容的提问来源于stack exchange,提问作者Suha Akrami
相关产品推荐
相关产品推荐

