据我搜索堆栈溢出答案,这不是“正常”排行榜排序问题。
我有一个用 javascript (Angular 2) 编写的联赛表,我可以根据需要按胜利、比赛次数等进行排序,如下所示:
standings.sort(function(a,b) {
return b.won - a.won || a.played - b.played;
});
但是,我的排序规则需要更深入地调整排序依据:
1) 获胜最多
2)玩的游戏最少
3) 然后,如果出现平局,计算出面对面获胜的比赛,然后计算这些面对面比赛的得分差异:
- 3 - a) 仅在第 1) 点和第 2) 点中的任何平局位置之间对正面交锋“获胜”进行排序。
- 3 - b) 仅在并列位置之间对头对头“点差异”进行排序。
复杂的部分(至少对我来说!)是,我只需要比较第 1) 点和第 2) 点中相同位置的球队的正面交锋胜利和积分差异,而这些球队只会是在执行时已知。
我想不出任何解决方案,更不用说一个优雅的解决方案了!下面的代码显然不起作用,我只是编写它来尝试帮助代表我想要实现的目标:
standings.sort(function(a,b) {
return b.won - a.won || a.played - b.played ||
a.head2heads[TIED_TEAM_KEY].wins - b.head2heads[TIED_TEAM_KEY].wins ||
a.head2heads[TIED_TEAM_KEY].diff- b.head2heads[TIED_TEAM_KEY].diff;
});
我在积分榜(我的联赛表)数组中的每支球队的属性(property)上获得了每支球队与其他球队的正面交锋胜利和积分差异。例如每个排名对象如下所示:
{ "teamname": "name",
"teamcode": "code",
"won": "8",
"lost": "10",
"played": 18,
"pointsScored": 1264,
"pointsAgainst": 1345,
"pointsDiff": -81,
"head2": { "OPP_NAME_A": {}, "OPP_NAME_B": {}, ... }
因此,现有数据可以挑选出单独的一对一结果。只需要按照上述标准进行优雅的排序即可。目前积分榜上只有 16 支球队(而且这一情况不太可能改变)。因此,即使是缓慢而冗长的解决方案也会有所帮助!
最佳答案
所以我最终弄清楚了,排序函数现在看起来像:
standings.sort(function(a,b) {
return b.won - a.won || a.played - b.played ||
b.head2[a.teamname].home.head2wins - a.head2[b.teamname].home.head2wins ||
b.head2[a.teamname].home.head2diff - a.head2[b.teamname].home.head2diff;
});
我想它本身并没有那么复杂,只是令人困惑的是在这么多层下隐藏了这么多数据!
关于javascript - JS排行榜复杂排序头2头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41809633/