AngularJS: порядок по сумме сгруппированного списка - PullRequest
0 голосов
/ 15 ноября 2018

У меня есть список результатов одиночных матчей разных команд в следующей форме:

    [{team: "A", w: 1, l: 0, t: 0, date: '2018-10-01'},
     {team: "B", w: 1, l: 0, t: 0, date: '2018-10-01'},
     {team: "C", w: 0, l: 1, t: 0, date: '2018-10-01'},
     {team: "D", w: 0, l: 1, t: 0, date: '2018-10-01'},
     {team: "A", w: 1, l: 0, t: 0, date: '2018-10-08'},
     {team: "B", w: 0, l: 1, t: 0, date: '2018-10-08'},
     {team: "C", w: 0, l: 0, t: 1, date: '2018-10-08'},
     {team: "D", w: 0, l: 0, t: 1, date: '2018-10-08'},
     {team: "A", w: 1, l: 0, t: 0, date: '2018-10-15'},
     {team: "D", w: 0, l: 0, t: 0, date: '2018-10-15'},
     {team: "B", w: 1, l: 0, t: 0, date: '2018-10-15'},
     {team: "B", w: 1, l: 0, t: 0, date: '2018-10-17'},
     {team: "B", w: 1, l: 0, t: 0, date: '2018-10-20'},
     {team: "C", w: 0, l: 1, t: 0, date: '2018-10-20'},
     {team: "C", w: 0, l: 1, t: 0, date: '2018-10-22'}]

Использование ng-repeat и angular.filter Теперь я могу отображать эти данные в таблице, сгруппированной по командам,Используя это предложение Я также могу агрегировать результаты игры, чтобы произвести запись для каждой команды:

Rank    Team    Games   Wins    Losses  Ties
1       A       3       3       0       0
2       D       3       0       1       1
3       C       4       0       3       1
4       B       5       4       1       0

Вот jsfiddle того, что я получил такдалеко.

Кроме того, у меня есть указатель даты , помещенный в представление, из которого пользователь сможет выбирать диапазоны дат.При изменении этих дат агрегаты обновляются.Это также уже работает.

Моя проблема сейчас в том, что я не могу упорядочить свой стол по какой-либо из отображаемых категорий.Я пробовал разные вещи, такие как использование любого вида orderBy: мыслимых предложений.Я также попытался поместить результат моего агрегирования в переменную (например, {{ wins = reduce(group, 'w') }}), на которую нужно ссылаться в orderBy:, но безрезультатно.

Возможно ли вообще то, чего я хотел бы достичь

1 Ответ

0 голосов
/ 15 ноября 2018

Одним из решений является использование того факта, что вы можете передать функцию в качестве аргумента выражения в orderBy.Внутри этой функции вы можете вычислить суммирование всех элементов в группе для каждого свойства, а затем использовать результат в качестве значения для упорядочения по.

Корректировка вашего HTML:

ng-repeat="group in data | groupBy: 'team' | toArray:true | orderBy:category"

И соответствующий JS, чтобы это произошло:

// $scope.order is a user option to specify the property to order by
$scope.category = function (value) {
    // The games column is not a data item property so it is treated specially
    if ($scope.order === 'games') {
        return value.length;
    }
    return value.reduce(function (total, dataItem) {
        return total + dataItem[$scope.order];
    }, 0);
};

И вот раздвоенный JSFiddle, демонстрирующий предложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...