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

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']

代码说明

  1. 转换数组:使用Object.values()提取球队完整数据,避免丢失积分与净胜分的对应关系
  2. 排序逻辑:
    • 将积分转为数字后按升序排序(若需降序可改为Number(b.points) - Number(a.points))
    • 积分相同时,将净胜分转为数字按降序排序,保证净胜分更高的队伍排在前面
  3. 统计积分次数:遍历排序后的数组,记录每个积分的出现次数,用于判断是否需要替换为净胜分
  4. 生成结果:对每个队伍,若积分重复则取净胜分,否则保留积分

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 01:55:32