JS лига стол сложный сорт голова 2 головы

Насколько я могу найти ответы о переполнении стека, это не "нормальная" проблема сортировки таблиц лиги.

У меня есть таблица лиги, с которой я работаю в javascript (angular 2), которую я могу сортировать по необходимости по победам, играм и т. Д. Примерно так:

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

Однако мои правила для сортировки должны быть более глубокими, чтобы настроиться на сортировку:

1) Большинство побед

2) Наименьшие сыгранные игры

3) Затем, если есть связанные места, определите выигранные матчи один на один, а затем в этих матчах один на один:

  • 3 - а) сортировка по голове "выигрывает" только между любыми привязанными позициями из пунктов 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;
});

У меня есть личные победы и очки различий каждой команды против каждой другой команды на свойстве каждой команды в массиве турнирной таблицы (таблица моей лиги). например, каждый объект турнирной таблицы выглядит так:

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

Таким образом, данные под рукой, чтобы выбрать индивидуальные личные результаты. Просто нужна элегантность, чтобы сортировать по критериям выше. На данный момент в турнирной таблице всего 16 команд (и вряд ли это когда-либо изменится). Так что даже медленное многословное решение было бы полезно!

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

Думаю, это не так уж сложно само по себе, просто сбивает с толку наличие большого количества данных, скрывающихся под таким количеством слоев!

Другие вопросы по тегам