Ngoài các câu trả lời được chấp nhận ở trên, tôi đã tạo bộ lọc 'groupBy' chung bằng thư viện underscore.js.
JSFiddle (đã cập nhật):
http://jsfiddle.net/TD7t3/
Bộ lọc
app.filter('groupBy', function() {
return _.memoize(function(items, field) {
return _.groupBy(items, field);
}
);
});
Lưu ý cuộc gọi 'ghi nhớ'. Phương pháp gạch dưới này lưu trữ kết quả của hàm và ngăn không cho đánh giá biểu thức bộ lọc mỗi lần, do đó ngăn không cho góc tới đạt giới hạn lặp lại tiêu hóa.
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>
Chúng tôi áp dụng bộ lọc 'groupBy' của chúng tôi trên biến phạm vi teamPlayers, trên thuộc tính 'nhóm'. Lặp lại ng của chúng tôi nhận được kết hợp (khóa, giá trị []) mà chúng tôi có thể sử dụng trong các lần lặp sau.
Cập nhật ngày 11 tháng 6 năm 2014
Tôi đã mở rộng nhóm bằng bộ lọc để tính đến việc sử dụng biểu thức làm khóa (ví dụ: các biến lồng nhau). Dịch vụ phân tích góc cạnh khá tiện lợi cho việc này:
Bộ lọc (có hỗ trợ biểu thức)
app.filter('groupBy', function($parse) {
return _.memoize(function(items, field) {
var getter = $parse(field);
return _.groupBy(items, function(item) {
return getter(item);
});
});
});
Bộ điều khiển (với các đối tượng lồng nhau)
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 (với biểu thức sortBy)
<li ng-repeat="(team, players) in teamPlayers | groupBy:'team.name'">
{{team}}
<ul>
<li ng-repeat="player in players">
{{player.name}}
</li>
</ul>
</li>
Mã thông báo:
http://jsfiddle.net/k7fgB/2/