# angular.Array.orderBy

## Description

Orders `array` by the `expression` predicate.

Note: this function is used to augment the `Array` type in angular expressions. See `angular.Array` for more info.

## Usage

    angular.Array.orderBy(array, expression[, reverse]);

### Parameters

- `array – {Array} –`

  The array to sort.

- `expression – {function(*)|string|Array.<(function(*)|string)>} –`

  A predicate to be used by the comparator to determine the order of elements.

  Can be one of:

  - `function`: getter function. The result of this function will be sorted using the `<`, `=`, `>` operator
  - `string`: angular expression which evaluates to an object to order by, such as 'name' to sort by a property called 'name'. Optionally prefixed with `+` or `-` to control ascending or descending sort order (e.g. +name or -name).
  - `Array`: array of function or string predicates, such that a first predicate in the array is used for sorting, but when the items are equivalent next predicate is used.
- `reverse(optional) – {boolean} –`

  Reverse the order the array.

### Returns

`{Array}` –

Sorted copy of the source array.

## Example

      <div ng:init="friends = [{name:'John', phone:'555-1212', age:10},
                               {name:'Mary', phone:'555-9876', age:19},
                               {name:'Mike', phone:'555-4321', age:21},
                               {name:'Adam', phone:'555-5678', age:35},
                               {name:'Julie', phone:'555-8765', age:29}]"></div>

      <pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>
      <hr/>
      [ <a href="" ng:click="predicate=''">unsorted</a> ]
      <table ng:init="predicate='-age'">
        <tr>
          <th><a href="" ng:click="predicate = 'name'; reverse=false">Name</a>
              (<a href ng:click="predicate = '-name'; reverse=false">^</a>)</th>
          <th><a href="" ng:click="predicate = 'phone'; reverse=!reverse">Phone Number</a></th>
          <th><a href="" ng:click="predicate = 'age'; reverse=!reverse">Age</a></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>

      it('should be reverse ordered by aged', function() {
        expect(binding('predicate')).toBe('Sorting predicate = -age; reverse = ');
        expect(repeater('.doc-example-live table', 'friend in friends').column('friend.age')).
          toEqual(['35', '29', '21', '19', '10']);
        expect(repeater('.doc-example-live table', 'friend in friends').column('friend.name')).
          toEqual(['Adam', 'Julie', 'Mike', 'Mary', 'John']);
      });

      it('should reorder the table when user selects different predicate', function() {
        element('.doc-example-live a:contains("Name")').click();
        expect(repeater('.doc-example-live table', 'friend in friends').column('friend.name')).
          toEqual(['Adam', 'John', 'Julie', 'Mary', 'Mike']);
        expect(repeater('.doc-example-live table', 'friend in friends').column('friend.age')).
          toEqual(['35', '10', '29', '19', '21']);

        element('.doc-example-live a:contains("Phone")').click();
        expect(repeater('.doc-example-live table', 'friend in friends').column('friend.phone')).
          toEqual(['555-9876', '555-8765', '555-5678', '555-4321', '555-1212']);
        expect(repeater('.doc-example-live table', 'friend in friends').column('friend.name')).
          toEqual(['Mary', 'Julie', 'Adam', 'Mike', 'John']);
      });