【问题标题】:JS league table complex sort head 2 headJS排行榜复杂排序头2头
【发布时间】:2017-01-23 15:17:29
【问题描述】:

就我可以搜索堆栈溢出的答案而言,这不是“正常”排行榜排序问题。

我有一个使用 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;
});

我在积分榜(我的排名表)数组中的每支球队的财产上获得了每支球队与其他球队的正面交锋胜利和积分差异。例如每个排名对象看起来像:

{   "teamname": "name",
    "teamcode": "code",
    "won": "8",
    "lost": "10",
    "played": 18,
    "pointsScored": 1264,
    "pointsAgainst": 1345,
    "pointsDiff": -81,
    "head2": { "OPP_NAME_A": {}, "OPP_NAME_B": {}, ... }

因此,手头的数据可以挑选出个人的头对头结果。只需要优雅地按照上述标准进行排序。目前积分榜上只有 16 支球队(这不太可能永远改变)。因此,即使是缓慢冗长的解决方案也会有所帮助!

【问题讨论】:

    标签: javascript angularjs arrays sorting head


    【解决方案1】:

    所以我最后想通了,排序函数现在看起来像:

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

    猜它本身并没有那么复杂,只是让这么多数据隐藏在这么多层下令人困惑!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-11-22
      • 2020-06-30
      • 2012-04-04
      • 2020-08-15
      • 2021-05-27
      • 1970-01-01
      • 2019-03-22
      • 2015-04-13
      相关资源
      最近更新 更多