Вы можете использовать groupBy модуля angular.filter .
так что вы можете сделать что-то вроде этого:
JS:
$scope.players = [
{name: 'Gene', team: 'alpha'},
{name: 'George', team: 'beta'},
{name: 'Steve', team: 'gamma'},
{name: 'Paula', team: 'beta'},
{name: 'Scruath', team: 'gamma'}
];
HTML:
<ul ng-repeat="(key, value) in players | groupBy: 'team'">
Group name: {{ key }}
<li ng-repeat="player in value">
player: {{ player.name }}
</li>
</ul>
РЕЗУЛЬТАТ:
Название группы: альфа
* игрок: Джин
Имя группы: бета
* игрок: Джордж
* игрок: Паула
Название группы: гамма
* игрок: Стив
* игрок: Скраат
ОБНОВЛЕНИЕ: jsbin Запомните основные требования к использованию angular.filter
, особенно обратите внимание, что вы должны добавить его к зависимостям вашего модуля:
(1) Вы можете установить угловой фильтр, используя 4 различных метода:
- клонировать и построить этот репозиторий
- через Bower: запустив $ bower, установите angular-filter со своего терминала
- через npm: запустив $ npm, установите angular-filter со своего терминала
- через cdnjs http://www.cdnjs.com/libraries/angular-filter
(2) Включите angular-filter.js (или angular-filter.min.js) в ваш index.html после включения самого Angular.
(3) Добавьте «angular.filter» в список зависимостей вашего основного модуля.
angular.filter
модуль.key
как объект. удачи с твоей стороныВ дополнение к принятым выше ответам я создал общий фильтр 'groupBy', используя библиотеку underscore.js.
JSFiddle (обновлено): http://jsfiddle.net/TD7t3/
Фильтр
Обратите внимание на «запомни» звонок. Этот метод подчеркивания кэширует результат функции и останавливает угловое вычисление выражения фильтра каждый раз, предотвращая тем самым угловое достижение предела итераций дайджеста.
HTML
Мы применяем наш фильтр «groupBy» к переменной области teamPlayers, к свойству «team». Наш ng-repeat получает комбинацию (key, values []), которую мы можем использовать в наших следующих итерациях.
Обновление 11 июня 2014 г. Я расширил группу с помощью фильтра, чтобы учесть использование выражений в качестве ключа (например, вложенных переменных). Сервис углового разбора очень удобен для этого:
Фильтр (с поддержкой выражений)
Контроллер (с вложенными объектами)
HTML (с выражением sortBy)
JSFiddle: http://jsfiddle.net/k7fgB/2/
источник
Сначала выполните цикл, используя фильтр, который будет возвращать только уникальные команды, а затем вложенный цикл, который возвращает всех игроков в текущей команде:
http://jsfiddle.net/plantface/L6cQN/
HTML:
сценарий:
источник
Изначально я использовал ответ Plantface, но мне не понравилось, как выглядит синтаксис на мой взгляд.
Я переработал его, чтобы использовать $ q.defer для пост-обработки данных и возврата списка по уникальным командам, который затем используется в качестве фильтра.
http://plnkr.co/edit/waWv1donzEMdsNMlMHBa?p=preview
Посмотреть
контроллер
источник
Оба ответа были хорошими, поэтому я переместил их в директиву, чтобы ее можно было многократно использовать, и не нужно было определять вторую переменную области видимости.
Вот скрипка, если вы хотите, чтобы она была реализована
Ниже приведена директива:
Тогда это можно использовать следующим образом:
источник
Обновить
Первоначально я написал этот ответ , потому что старая версия решения , предложенного Ариэлем М. в сочетании с другими
$filter
с вызвало « Ошибка Infite $ diggest Loop » (infdig
) . К счастью, эта проблема была решена в последней версии angular.filter .Я предложил следующую реализацию, у которой не было этой проблемы :
Однако эта реализация будет работать только с версиями, предшествующими Angular 1.3. (Я скоро обновлю этот ответ, предоставив решение, которое работает со всеми версиями.)
Я действительно написал пост о шагах, которые я предпринял, чтобы развить это
$filter
, проблемах, с которыми я столкнулся, и вещах, которые я изучил из этого .источник
angular-filter
версию - 0.5.0, больше нет исключений.groupBy
может быть цепным с любым фильтром. Кроме того, вы отлично завершили тестовые задания - вот вам спасибо.В дополнение к принятому ответу вы можете использовать это, если вы хотите сгруппировать по нескольким столбцам :
источник
Если вам это нужно в коде JS. Вы можете использовать встроенный метод angula-filter lib. Как это.
https://github.com/a8m/angular-filter/wiki/Common-Questions#inject-filters
источник