Search code examples
javascriptangularjsangularjs-orderby

AngularJS orderyby on two digits


JS:

(function(angular) {
  'use strict';
angular.module('orderByExample', [])
  .controller('ExampleController', ['$scope', function($scope) {
    $scope.friends =
        [{name:'John', phone:'2-3-7', age:10},
         {name:'Mary', phone:'2-3-9', age:19},
         {name:'Mike', phone:'10-21-30', age:21},
         {name:'Adam', phone:'1-5-9', age:35},
         {name:'Julie', phone:'9-15-20', age:29}];
    $scope.predicate = 'phone';
    $scope.reverse = true;
    $scope.order = function(predicate) {
      $scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false;
      $scope.predicate = predicate;
    };
  }]);
})(window.angular);

HTML:

<table class="friend">
    <tr>        
     <th>
         <button ng-click="order('phone')">Phone Number</button>
         <span class="sortorder" ng-show="predicate === 'phone'" ng-class="{reverse:reverse}"></span>
     </th>         
    </tr>
    <tr ng-repeat="friend in friends | orderBy:predicate">
      <td>{{friend.name}}</td>
      <td>{{friend.phone}}</td>
      <td>{{friend.age}}</td>
    </tr>
  </table>

Result:

Number

  • 2-3-7
  • 2-3-9
  • 10-21-30
  • 9-15-20
  • 1-5-9

But i want this result:

Number

  • 1-5-9
  • 2-3-7
  • 2-3-9
  • 9-15-20
  • 10-21-30

I want to sort based on Number only

Here is the plunker link: http://plnkr.co/edit/QPNVtKQCqk2nYYkFx4aX?p=preview


Solution

  • You can sort by numeric representation of the phone. For example like this:

    $scope.friends = [...].map(function(friend) {
        friend.phoneNumber = Number(friend.phone.replace(/[^\d]/g, ''));
        return friend;
    });
    

    And then in template use phoneNumber for ordering:

    <th>
         <button ng-click="order('phoneNumber')">Phone Number</button>
         <span class="sortorder" ng-show="predicate === 'phoneNumber'" ng-class="{reverse:reverse}"></span>
    </th>
    

    Demo: http://plnkr.co/edit/CgYc5wRBmJLMWDfG74gI?p=info