Selain jawaban yang diterima di atas, saya membuat filter 'groupBy' umum menggunakan pustaka underscore.js.
JSFiddle (diperbarui):
http://jsfiddle.net/TD7t3/
Filter
app.filter('groupBy', function() {
return _.memoize(function(items, field) {
return _.groupBy(items, field);
}
);
});
Perhatikan panggilan 'memoize'. Metode garis bawah ini menyimpan hasil dari fungsi dan menghentikan angular dari mengevaluasi ekspresi filter setiap saat, sehingga mencegah angular mencapai batas iterasi intisari.
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>
Kami menerapkan filter 'groupBy' kami pada variabel cakupan teamPlayers, di properti 'tim'. Ng-repeat kita menerima kombinasi (key, values []) yang bisa kita gunakan dalam iterasi berikut.
Perbarui 11 Juni 2014
Saya memperluas grup dengan filter untuk memperhitungkan penggunaan ekspresi sebagai kunci (misalnya variabel bersarang). Layanan angular parse sangat berguna untuk ini:
Filter (dengan dukungan ekspresi)
app.filter('groupBy', function($parse) {
return _.memoize(function(items, field) {
var getter = $parse(field);
return _.groupBy(items, function(item) {
return getter(item);
});
});
});
Pengontrol (dengan objek bersarang)
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 (dengan ekspresi 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/