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;
});
Думаю, это не так уж сложно само по себе, просто сбивает с толку наличие большого количества данных, скрывающихся под таким количеством слоев!