Angular 2 Pipes: How to sort by multiple fields?

2.5k Views Asked by At

I have a list with the following details which I want to sort by the one with the most number of reviews and then sorted alphabetically afterwards.

    [
     {
      "reviews": 9,
      "name": 'B'
     }, {
      "reviews": 9,
      "name": 'A'
     }, {
      "reviews": 15,
      "name": 'C'
     }, {
      "reviews": 9,
      "name": 'D'
     },..
    ]

My desired sequence for the sort will be: C A B D. I have a simple sorting pipe to sort it by reviews but I wanted it to sort by name afterwards.

    items.sort(function(a, b) {
      return a['reviews'] - b['reviews'];
    }

Thanks.

2

There are 2 best solutions below

0
On
 @Pipe({
        name: 'filter'
    })
    export class FilterPipe implements PipeTransform {
        transform(items: Array<any>, filter: {[key: string]: any }): Array<any> {
            return items.filter(item => {
                let notMatchingField = Object.keys(filter)
                                             .find(key => item[key] !== filter[key]);

                return !notMatchingField; // true if matches all fields
            });
        }
    }
1
On
items
 .sort(function(a, b) {
      return a['reviews'] - b['reviews'];
    }
  .sort(function(a, b) {
    let a = a['name'].toUpperCase();
    let b = b['name'].toUpperCase();
    return (a < b) ? -1 : (a > b) ? 1 : 0;
   });

or you can use toLocalCompare

items
     .sort(function(a, b) {
          return a['reviews'] - b['reviews'];
        }
      .sort(function(a, b) {
        return a['name'].localeCompare(b['name']);
       });