Paulos3000
Paulos3000

Reputation: 3545

Sorting minus number strings with AngularJS 'orderBy'

I am reverse ordering some number strings with the orderBy directive that can be used in conjunction with ngRepeat.

 <div ng-repeat="item in standings| orderBy:['-points', '-gd', 'team_name']">
      <p>{{item.gd}}
 </div>

So it is ordering (in order of priority) 'points', then 'gd' (goal difference), then 'team_name' (alphabetically).

The gd value correctly orders by descending value. The problem I have is with negative number values. In this instance, numbers are returned as strings, and the orderBy function doesn't understand "-2" as being less than "-1", but the opposite.

How can I get ng-repeat to parse the number values into integers, particularly to solve this ordering issue with minus numbers?

I considered making a filter, e.g: {{item.gd | *filterHere* }}, but this wouldn't be seen by the initial ng-repeat directive, which needs to take the source value as an integer.

Any help would be appreciated.


UPDATE:

I tried this filter, but when I call it in my ng-repeat, it returns nothing:

 app.filter('stringToInteger', function() {
       return function(input) {
             angular.forEach(input, function(value) {
                 parseInt(value.gd);
             })
          };
       return input;
   });

In the View:

<p ng-repeat="item in standings | orderBy: '-gd' | stringToInteger">GD = {{item.gd}}</p>

Upvotes: 1

Views: 1919

Answers (1)

Deep
Deep

Reputation: 9794

the filter should be like this.

app.filter('stringToInteger', function() {
   return function(input) {
         angular.forEach(input, function(value) {
            value.gd =  parseInt(value.gd);
         })
   return input;
   };
});

Use it like this .

<tr ng-repeat="team in teams | stringToInteger | orderBy:'-gd'">

Plunker link for more reference.

https://plnkr.co/edit/GRfMJnRdT1Gu5RXO9elA?p=preview

Upvotes: 3

Related Questions