Улучшить документацию Просмотреть исходный код orderBy
- Фильтр в модуле ng
Обзор
Возвращает массив, содержащий элементы из указанного collection, отсортированные по comparator функции на основе значений, вычисленных с помощью expression предиката.
Например, [{id: 'foo'}, {id: 'bar'}] | orderBy:'id' приведет к [{id: 'bar'}, {id: 'foo'}].
collection может быть массивом или массивоподобным объектом (например, NodeList, объект jQuery, TypedArray, строка и т. д.).
expression может быть одним предикатом или списком предикатов, каждый из которых служит разрывом для предыдущего. expression оценивается для каждого элемента, а вывод используется для сравнения с другими элементами.
Вы можете изменить порядок сортировки, установив reverse в true. По умолчанию элементы сортируются по возрастанию.
Сравнение выполняется с помощью функции comparator. Если она не указана, используется по умолчанию встроенный компаратор (подробности см. ниже — вкратце, он сравнивает числа численно, а строки по алфавиту).
Внутри
Сортировка указанного collection происходит в два этапа:
- Все элементы передаются через предикат (или предикаты), и возвращаемые значения сохраняются вместе с их типом (
string,numberи т. д.). Например, элемент{label: 'foo'}, прошедший через предикат, извлекающий значение свойстваlabel, будет преобразован в:{ value: 'foo', type: 'string', index: ... } - Функция компаратора используется для сортировки элементов на основе полученных значений, типов и индексов.
Если вы используете пользовательский компаратор, он будет вызываться с парами объектов вида {value: ..., type: '...', index: ...} и должен возвращать 0, если объекты равны (с точки зрения компаратора), -1, если первый объект должен иметь более высокую позицию, чем второй, или 1 в противном случае.
Чтобы гарантировать детерминированную сортировку на всех платформах, если ни один из указанных предикатов не может отличить два элемента, orderBy автоматически введет дополнительный предикат, который возвращает индекс элемента в качестве value. (Если вы используете пользовательский компаратор, убедитесь, что он также может обрабатывать этот предикат.)
Если пользовательский компаратор по-прежнему не может отличить два элемента, они будут отсортированы по своему индексу с использованием встроенного компаратора.
Наконец, чтобы упростить вещи, если предикат возвращает объект в качестве извлечённого значения для элемента, orderBy попытается преобразовать этот объект в примитивное значение перед передачей его компаратору. Следующие правила управляют преобразованием:
- Если объект имеет метод
valueOf(), который возвращает примитив, его возвращаемое значение будет использоваться вместо него.
(Если объект имеет методvalueOf(), который возвращает другой объект, то возвращаемый объект будет использоваться на последующих шагах.) - Если у объекта есть пользовательский метод
toString()(т. е. не унаследованный отObject), который возвращает примитив, его возвращаемое значение будет использоваться вместо него.
(Если объект имеет методtoString(), который возвращает другой объект, то возвращаемый объект будет использоваться на последующих шагах.) - Преобразование не выполняется; используется сам объект.
Встроенный компаратор по умолчанию
Встроенный компаратор по умолчанию должен подойти для большинства случаев использования. Короче говоря, он сравнивает числа численно, строки алфавитно (и регистронезависимо), для объектов использует их индекс в исходном наборе, и сортирует значения разных типов по типу.
Более конкретно, он выполняет следующие действия для определения относительного порядка элементов:
- Если сравниваемые значения имеют разные типы, сравните типы сами по алфавиту.
- Если оба значения имеют тип
string, сравните их алфавитно, не учитывая регистр и локаль. - Если оба значения являются объектами, сравните их индексы.
- В противном случае верните:
-
0, если значения равны (по точному сравнению, т. е. используя===). -
-1, если первое значение "меньше", чем второе значение (сравнение выполняется с помощью оператора<). -
1, в противном случае.
-
Примечание: Если вы заметили, что числа не сортируются так, как ожидается, убедитесь, что они фактически сохраняются как числа, а не строки. Примечание: Для целей сортировки значения null обрабатываются как строка 'null' (т. е. type: 'string', value: 'null'). Это может привести к неожиданному порядку сортировки по сравнению с другими значениями.
Использование
В привязке шаблонов HTML
{{ orderBy_expression | orderBy : expression : reverse : comparator}}
В JavaScript
$filter('orderBy')(collection, expression, reverse, comparator)
Аргументы
| Параметр | Тип | Подробности |
|---|---|---|
| collection | ArrayArrayLike |
Массив или массивоподобный объект для сортировки. |
| expression (необязательно) |
function()stringArray.<(function()|string)> |
Предикат (или список предикатов), который используется компаратором для определения порядка элементов. Может быть одним из:
Примечание: Если предикат отсутствует или пуст, он по умолчанию устанавливается в |
| reverse (необязательно) |
boolean |
Если |
| comparator (необязательно) |
function() |
Функция компаратора, используемая для определения относительного порядка пар значений. Если опущена, будет использоваться встроенный компаратор. |
Возвращает
Array |
|
Примеры
Сортировка таблицы с помощью ngRepeat
Ниже приведен пример простого ngRepeat, где данные отсортированы по возрасту в порядке убывания (выражение установлено в '-age'). Параметр comparator не установлен, поэтому используется встроенный компаратор по умолчанию.
Динамическое изменение параметров
Все параметры могут быть изменены динамически. Следующий пример показывает, как сделать столбцы таблицы сортируемыми, связав параметры expression и reverse со свойствами области видимости.
Использование orderBy внутри контроллера
Также возможно вызывать фильтр orderBy вручную, введя orderByFilter, и вызвав его с желаемыми параметрами. (В качестве альтернативы, можно ввести фабрику $filter и получить фильтр orderBy с помощью $filter('orderBy').)
Использование пользовательского компаратора
Если у вас есть очень специфические требования к тому, как сортируются элементы, вы можете передать свою собственную функцию компаратора. Например, вам может потребоваться сравнить некоторые строки с учетом локали. (При указании пользовательского компаратора также необходимо передать значение для аргумента reverse — передача false сохраняет порядок сортировки по умолчанию, т. е. по возрастанию).
© 2010–2018 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.6.9/docs/api/ng/filter/orderBy