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) 然后如果有平局,算出 对决 场比赛获胜,然后 对决 的得分差异] 游戏:
- 3 - a) 头对头排序 'wins' 仅在点 1) 和 2) 的任何平局位置之间。
- 3 - b) 仅在并列位置之间按头对头排序 'points diff'。
复杂的部分(至少对我而言!)是我只需要将正面交锋的胜利和积分差异与第 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;
});
我猜它本身并没有那么复杂,只是混淆了隐藏在这么多层下的这么多数据!
据我搜索堆栈溢出答案,这 不是 'normal' 联盟 table 排序问题。
我有一个联盟 table 我在 javascript (angular 2) 工作,我可以根据需要根据胜利、比赛等进行排序,如下所示:
standings.sort(function(a,b) {
return b.won - a.won || a.played - b.played;
});
但是我的排序规则需要更加深入,以符合排序依据:
1) 最多获胜
2) 最少玩的游戏
3) 然后如果有平局,算出 对决 场比赛获胜,然后 对决 的得分差异] 游戏:
- 3 - a) 头对头排序 'wins' 仅在点 1) 和 2) 的任何平局位置之间。
- 3 - b) 仅在并列位置之间按头对头排序 'points diff'。
复杂的部分(至少对我而言!)是我只需要将正面交锋的胜利和积分差异与第 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;
});
我猜它本身并没有那么复杂,只是混淆了隐藏在这么多层下的这么多数据!