Zusätzlich zu den oben akzeptierten Antworten habe ich mithilfe der Bibliothek underscore.js einen generischen 'groupBy'-Filter erstellt.
JSFiddle (aktualisiert):
http://jsfiddle.net/TD7t3/
Der Filter
app.filter('groupBy', function() {
return _.memoize(function(items, field) {
return _.groupBy(items, field);
}
);
});
Beachten Sie den Aufruf 'merken'. Diese Unterstrichmethode speichert das Ergebnis der Funktion im Cache und verhindert, dass Angular den Filterausdruck jedes Mal auswertet, wodurch verhindert wird, dass Angular die Digest-Iterationsgrenze erreicht.
Das 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>
Wir wenden unseren Filter 'groupBy' auf die Bereichsvariable teamPlayers in der Eigenschaft 'team' an. Unsere ng-Wiederholung erhält eine Kombination von (Schlüssel, Werte []), die wir in unseren folgenden Iterationen verwenden können.
Update 11. Juni 2014
Ich habe die Gruppe nach Filter erweitert, um die Verwendung von Ausdrücken als Schlüssel (z. B. verschachtelte Variablen) zu berücksichtigen. Der eckige Analyseservice ist hierfür sehr praktisch:
Der Filter (mit Ausdrucksunterstützung)
app.filter('groupBy', function($parse) {
return _.memoize(function(items, field) {
var getter = $parse(field);
return _.groupBy(items, function(item) {
return getter(item);
});
});
});
Der Controller (mit verschachtelten Objekten)
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}];
});
Das HTML (mit sortBy Ausdruck)
<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/