JS联盟table复杂排序头2头

JS league table complex sort head 2 head

据我搜索堆栈溢出答案,这 不是 'normal' 联盟 table 排序问题。

我有一个联盟 table 我在 javascript (angular 2) 工作,我可以根据需要根据胜利、比赛等进行排序,如下所示:

standings.sort(function(a,b) {
 return b.won - a.won || a.played - b.played;
});

但是我的排序规则需要更加深入,以符合排序依据:

1) 最多获胜

2) 最少玩的游戏

3) 然后如果有平局,算出 对决 场比赛获胜,然后 对决 的得分差异] 游戏:

复杂的部分(至少对我而言!)是我只需要将正面交锋的胜利和积分差异与第 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;
});

我在积分榜(我的联盟 table)数组中的每支球队的 属性 中获得了每支球队与其他球队的正面交锋和积分差异。例如每个排名对象看起来像:

{   "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;
});

我猜它本身并没有那么复杂,只是混淆了隐藏在这么多层下的这么多数据!