AngularJS — ngOptions: как упорядочить по имени группы, а затем по метке

Предположим, у меня есть следующий массив данных в этой форме:

var data = [{group:GroupA, label: BB}, {group:GroupB, label: DD}.....].

Моя привязка будет выглядеть примерно так:

<select data-ng-options="c as c.label group by c.group for c in data"></select>

Я хотел бы, чтобы в раскрывающемся списке были перечислены все элементы с GroupA до GroupB, а также они были отсортированы по каждой группе.

Что-то вроде этого:

GroupA
AA
BB
CC

GroupB
DD
EE
FF

Я знаю, что могу использовать фильтр orderBy Angular, но на самом деле он не работает так, как мне нужно. Я предполагаю, что мне нужно написать собственный фильтр, который вручную упорядочивает список так, как я хочу, но мне было интересно, есть ли более простой способ выполнить эту задачу.


person T.Ho    schedule 12.06.2013    source источник


Ответы (2)


orderBy может принимать массив из нескольких параметров для упорядочения. Итак, вы можете сделать:

c as c.label group by c.group for c in data | orderBy:['group','label']

Вот скрипка

person Dan    schedule 13.06.2013
comment
Спасибо. Я не знал, что вы можете передать массив в orderBy. Думаю, я упускаю из виду эту часть документации angularjs. Но, по крайней мере, я знал, что есть более простой способ, так как это будет довольно распространенный вариант использования. - person T.Ho; 13.06.2013
comment
не могли бы вы указать порядок сортировки, используя этот метод? т. е. я хочу отсортировать по группе asc, а затем пометить desc? - person Ross Jones; 18.10.2013
comment
@RossJones Да, вы бы изменили ['group','label'] на ['+group','-label'] - person Dan; 01.11.2013
comment
Работал отлично для меня. Спасибо - person Tony Brasunas; 11.12.2018

Похоже, orderBy будет работать именно так, как вы хотите.

Просто возьмите свое выражение и добавьте orderBy в конце:

c as c.label group by c.group for c in data | orderBy:'label'

Это сначала упорядочит массив data по значению свойства label каждого элемента, а затем сгруппирует их. Поскольку данные будут упорядочены правильно, каждая группа будет правильно отсортирована.

Вот скрипка.

Обратите внимание, что исходный массив определен в обратном порядке, но правильно отсортирован в каждой группе при выборе.

person satchmorun    schedule 13.06.2013
comment
это на самом деле не гарантирует, что группа A будет раньше группы B. Если у вас есть группа A, содержащая только GG, HH, II, порядок будет обратным. Наверное, я привел плохой пример. :П. На самом деле мне удалось заставить это работать, сначала отсортировав по группе, а если две группы одинаковы, то отсортируйте их по значению метки. - person T.Ho; 13.06.2013