Orders a specified array
by the expression
predicate. It is ordered alphabetically
for strings and numerically for numbers. Note: if you notice numbers are not being sorted
as expected, make sure they are actually being saved as numbers and not strings.
Array-like values (e.g. NodeLists, jQuery objects, TypedArrays, Strings, etc) are also supported.
{{ orderBy_expression | orderBy : expression : reverse}}
$filter('orderBy')(array, expression, reverse)
Param | Type | Details |
---|---|---|
array | Array |
The array (or array-like object) to sort. |
expression | function(*)stringArray.<(function(*)|string)>= |
A predicate to be used by the comparator to determine the order of elements. Can be one of:
|
reverse
(optional)
|
boolean |
Reverse the order of the array. |
Array | Sorted copy of the source array. |
The example below demonstrates a simple ngRepeat, where the data is sorted
by age in descending order (predicate is set to '-age'
).
reverse
is not set, which means it defaults to false
.
<div ng-controller="ExampleController">
<table class="friend">
<tr>
<th>Name</th>
<th>Phone Number</th>
<th>Age</th>
</tr>
<tr ng-repeat="friend in friends | orderBy:'-age'">
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
<td>{{friend.age}}</td>
</tr>
</table>
</div>
The predicate and reverse parameters can be controlled dynamically through scope properties, as shown in the next example.
<div ng-controller="ExampleController">
<pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>
<hr/>
<button ng-click="predicate=''">Set to unsorted</button>
<table class="friend">
<tr>
<th>
<button ng-click="order('name')">Name</button>
<span class="sortorder" ng-show="predicate === 'name'" ng-class="{reverse:reverse}"></span>
</th>
<th>
<button ng-click="order('phone')">Phone Number</button>
<span class="sortorder" ng-show="predicate === 'phone'" ng-class="{reverse:reverse}"></span>
</th>
<th>
<button ng-click="order('age')">Age</button>
<span class="sortorder" ng-show="predicate === 'age'" ng-class="{reverse:reverse}"></span>
</th>
</tr>
<tr ng-repeat="friend in friends | orderBy:predicate:reverse">
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
<td>{{friend.age}}</td>
</tr>
</table>
</div>
It's also possible to call the orderBy filter manually, by injecting $filter
, retrieving the
filter routine with $filter('orderBy')
, and calling the returned filter routine with the
desired parameters.
Example:
<div ng-controller="ExampleController">
<pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>
<table class="friend">
<tr>
<th>
<button ng-click="order('name')">Name</button>
<span class="sortorder" ng-show="predicate === 'name'" ng-class="{reverse:reverse}"></span>
</th>
<th>
<button ng-click="order('phone')">Phone Number</button>
<span class="sortorder" ng-show="predicate === 'phone'" ng-class="{reverse:reverse}"></span>
</th>
<th>
<button ng-click="order('age')">Age</button>
<span class="sortorder" ng-show="predicate === 'age'" ng-class="{reverse:reverse}"></span>
</th>
</tr>
<tr ng-repeat="friend in friends">
<td>{{friend.name}}</td>
<td>{{friend.phone}}</td>
<td>{{friend.age}}</td>
</tr>
</table>
</div>