除了上面接受的答案之外,我还使用下划线.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/