如何使用角度过滤器对数据进行分组?

2022-08-30 04:15:31

我有一个球员名单,每个球员都属于一个小组。如何使用筛选器列出每个组的用户?

[{name: 'Gene', team: 'team alpha'},
 {name: 'George', team: 'team beta'},
 {name: 'Steve', team: 'team gamma'},
 {name: 'Paula', team: 'team beta'},
 {name: 'Scruath of the 5th sector', team: 'team gamma'}];

我正在寻找这个结果:

  • 阿尔法团队
    • 基因
  • 团队测试版
    • 乔治
    • 宝拉
  • 伽马团队
    • 史蒂夫
    • 第五部门的争夺

答案 1

您可以使用 angular.filter 模块的 groupBy。
所以你可以做这样的事情:

JS:

$scope.players = [
  {name: 'Gene', team: 'alpha'},
  {name: 'George', team: 'beta'},
  {name: 'Steve', team: 'gamma'},
  {name: 'Paula', team: 'beta'},
  {name: 'Scruath', team: 'gamma'}
];

网页:

<ul ng-repeat="(key, value) in players | groupBy: 'team'">
  Group name: {{ key }}
  <li ng-repeat="player in value">
    player: {{ player.name }} 
  </li>
</ul>

结果:
组名: 阿尔法
* 球员: 基因
组名: 贝塔
* 球员: 乔治
* 球员: 宝拉
组名: 伽玛
* 球员: 史蒂夫
* 球员: 斯克鲁阿斯

更新:jsbin 记住要使用的基本要求,特别注意您必须将其添加到模块的依赖项中:angular.filter

(1)您可以使用4种不同的方法安装角度过滤器:

  1. 克隆和构建此存储库
  2. 通过鲍尔:通过运行 $ 鲍尔从您的终端安装角度过滤器
  3. 通过 npm: 通过运行 $ npm 从终端安装角度过滤器
  4. 通过 cdnjs http://www.cdnjs.com/libraries/angular-filter

(2) 在包含 Angular 本身之后,在索引.html中包含 angular-filter.js(或 angular-filter.min.js)。

(3) 将“angular.filter”添加到主模块的依赖项列表中。


答案 2

除了上面接受的答案之外,我还使用下划线.js库创建了一个通用的“groupBy”筛选器。

JSFiddle(已更新):http://jsfiddle.net/TD7t3/

过滤器

app.filter('groupBy', function() {
    return _.memoize(function(items, field) {
            return _.groupBy(items, field);
        }
    );
});

请注意“备忘录”调用。此下划线方法缓存函数的结果,并阻止 angular 每次都计算滤镜表达式,从而防止 angular 达到摘要迭代限制。

该网页

<ul>
    <li ng-repeat="(team, players) in teamPlayers | groupBy:'team'">
        {{team}}
        <ul>
            <li ng-repeat="player in players">
                {{player.name}}
            </li>
        </ul>
    </li>
</ul>

我们将“groupBy”筛选器应用于 teamPlayers 作用域变量的“团队”属性。我们的 ng-repeat 接收(键,值[])的组合,我们可以在下面的迭代中使用。

更新于2014年6月11日我通过过滤器扩展了组,以考虑使用表达式作为键(例如嵌套变量)。角度解析服务非常方便:

筛选器(带表达式支持)

app.filter('groupBy', function($parse) {
    return _.memoize(function(items, field) {
        var getter = $parse(field);
        return _.groupBy(items, function(item) {
            return getter(item);
        });
    });
});

控制器(包含嵌套对象)

app.controller('homeCtrl', function($scope) {
    var teamAlpha = {name: 'team alpha'};
    var teamBeta = {name: 'team beta'};
    var teamGamma = {name: 'team gamma'};

    $scope.teamPlayers = [{name: 'Gene', team: teamAlpha},
                      {name: 'George', team: teamBeta},
                      {name: 'Steve', team: teamGamma},
                      {name: 'Paula', team: teamBeta},
                      {name: 'Scruath of the 5th sector', team: teamGamma}];
});

html(使用 sortBy 表达式)

<li ng-repeat="(team, players) in teamPlayers | groupBy:'team.name'">
    {{team}}
    <ul>
        <li ng-repeat="player in players">
            {{player.name}}
        </li>
    </ul>
</li>

JSFiddle: http://jsfiddle.net/k7fgB/2/