如何在JavaScript中按指定规则筛选数组中的前2支球队?
按规则筛选晋级球队的简洁实现方案
嘿,这个问题我太懂了!完全不用写一堆繁琐的if-else去挨个判断每种情况,JavaScript的数组sort()方法就能完美适配你的优先级规则,一步搞定排序和筛选。
先明确你的数据和规则:
原始数据
var arr = [ {id: 1, p: 7, gs: 11, ga: 7, gd: 4}, {id: 2, p: 4, gs: 10, ga: 8, gd: 2}, {id: 3, p: 3, gs: 7, ga: 9, gd: -2}, {id: 4, p: 3, gs: 5, ga: 9, gd: -4} ];
字段含义
- p: Points(积分)
- gs: Goals Scored(进球数)
- ga: Goals Against(失球数)
- gd: Goal Difference(净胜球)
筛选规则(优先级从高到低)
- 积分高的晋级
- 积分相同则看净胜球,净胜球高的晋级
- 净胜球相同则看进球数,进球数多的晋级
- 三者均相同,随机决定结果
核心实现代码
我们可以利用Array.sort()的自定义比较函数,把优先级逻辑按顺序嵌入进去:
// 先复制原数组,避免修改原始数据 const sortedTeams = [...arr].sort((teamA, teamB) => { // 第一优先级:积分降序 if (teamA.p !== teamB.p) { return teamB.p - teamA.p; } // 第二优先级:净胜球降序 if (teamA.gd !== teamB.gd) { return teamB.gd - teamA.gd; } // 第三优先级:进球数降序 if (teamA.gs !== teamB.gs) { return teamB.gs - teamA.gs; } // 三者都相同,随机排序(返回-0.5到0.5之间的随机数,sort会随机调整顺序) return Math.random() - 0.5; }); // 取出前2支晋级球队 const qualifiedTeams = sortedTeams.slice(0, 2); console.log(qualifiedTeams);
代码解释
- 用
[...arr]创建原数组的副本,这样排序操作不会改动原始数据,保持数据的纯净性 - 比较函数按照你的规则优先级依次判断:每一层只处理当前维度的差异,不同就返回差值(降序用
b - a),相同则自动进入下一层判断 - 最后三者都相同时,
Math.random() - 0.5会生成随机的正负值,让sort()随机调整这两个球队的位置,完美实现随机决定的需求
这种写法的好处是逻辑完全贴合规则,结构清晰易维护,不用去枚举所有可能的情况,每一步只聚焦当前优先级的判断,非常高效。
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

