除了上面接受的答案,我使用 underscore.js 库创建了一个通用的 'groupBy' 过滤器。
JSFiddle(已更新):http://jsfiddle.net/TD7t3/
该过滤器:
app.filter('groupBy', function() {
return _.memoize(function(items, field) {
return _.groupBy(items, field);
}
);
});
注意'memoize'函数的调用。这个underscore方法缓存了函数的结果,防止Angular在每次评估筛选器表达式时都重新计算结果,从而防止Angular达到digest迭代限制。
HTML
<ul>
<li ng-repeat="(team, players) in teamPlayers | groupBy:'team'">
{{team}}
<ul>
<li ng-repeat="player in players">
{{player.name}}
</li>
</ul>
</li>
</ul>
我们在teamPlayers作用域变量上的“groupBy”筛选器上,应用于“team”属性。我们的ng-repeat接收到一个(key, values[])组合,我们可以在接下来的迭代中使用它们。
2014年6月11日更新
我扩展了group by筛选器来考虑将表达式作为键(例如嵌套变量)的情况。Angular解析服务非常有用:
带有表达式支持的筛选器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}];
});
使用sortBy表达式的HTML代码
<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/
angular.filter
模块。 - PucegroupBy: 'team || age'
。这里有一些fiddle来演示它。谢谢。 - a8m