Search code examples
javascriptangularjsangularjs-ng-repeatangular-filters

Angular order by numbers with decimals


I have the following array:

[
 {volume:49, number: 1}, 
 {volume:48, number: 3}, 
 {volume:4,  number: 1}, 
 {volume:4,  number: 4}, 
 {volume:1,  number: 1}, 
 {volume:9,  number: 2}, 
 {volume:5,  number: 1}, 
 {volume:5,  number: 2}
]

My current filtering is ordering the numbers

[9.2, 5.1, 5.2, 49.1, 48.3, 4.4, 4.1, 1.1 ]

Here is my ng-repeat:

<a ng-repeat="item in issueList | orderBy:['-volume','-number']">
    <div>
       {{ item.volume }}.{{ item.number }}
    </div>
</a>

Is my current logic incorrect? It seems like the ordering for volume is looking at the first number, somehow resulting in 9 and 5 coming before 49


Solution

  • It seems like your numbers are treated as strings, that is why they are not sorted as expected.

    Try to make them integers in an implicit way:

    $scope.items = [
      {volume:'49', number: 1}, 
      {volume:'48', number: 3}, 
      {volume:'4',  number: 1}, 
      {volume:'4',  number: 4}, 
      {volume:'1',  number: 1}, 
      {volume:'9',  number: 2}, 
      {volume:'5',  number: 1}, 
      {volume:'5',  number: 2}
    ];
    angular.forEach($scope.items, function (item) {
        console.log(item);
        item.volume = +item.volume;
    });