Vladimir Djukic
Vladimir Djukic

Reputation: 2072

Sort by date Angular 2 pipe

Here is my code:

<div *ngFor="let conv of lender.conversation | orderBy" class="conv-single">
   {{conv.date | date: 'dd/MM/yyyy | j'}} - {{conv.text}}
</div>

I have object like this:

[{
date: somedate,
text: "text1" 
}
...]

And here is my orderBy pipe:

@Pipe({
    name: 'orderBy'
})
export class OrderByPipe implements PipeTransform {

    transform(value: any, args?: any): any {
        let newVal = value.sort((a: any, b: any) => {
            let date1 = new Date(a.date);
            let date2 = new Date(b.date);

            if (date1 > date2) {
                return 1;
            } else if (date1 < date2) {
                return -1;
            } else {
                return 0;
            }
        });

        return newVal;
    }

}

Problem is I always get elements in same order anyone know what is problem?

Upvotes: 5

Views: 27114

Answers (3)

Ranjith Rana
Ranjith Rana

Reputation: 164

import { Pipe, PipeTransform } from '@angular/core';

@Pipe({
  name: 'sortByDate'
})
export class SortByDatePipe implements PipeTransform {
  transform(value: any, args?: any): any {
    const sortedValues = value.sort((a, b) => new Date(b.createdOn).getTime() - new Date(a.createdOn).getTime());
    return sortedValues;
  }
}

Upvotes: 1

Ram Pukar
Ram Pukar

Reputation: 1621

sort-list.pipe.ts

import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
  name: 'sortList'
})
export class SortListPipe implements PipeTransform {
  transform(value: any, args?: any): any {
        if (typeof args[0] === "undefined") {
                return value;
        }
        let direction = args[0][0];
        let column = args.replace('-','');
        value.sort((a: any, b: any) => {
                let left = Number(new Date(a[column]));
                let right = Number(new Date(b[column]));
                return (direction === "-") ? right - left : left - right;
        });
        return value;
    }
}

product-list.component.html

/*
Ascending Order: create_date
Descending Order: -create_date
*/
<ul>
    <li *ngFor="let item of productList | sortList : '-create_date'>
</ul>

Upvotes: 0

George Oiko
George Oiko

Reputation: 1433

It is strongly suggested not to use such pipes according to Angular Documentation. See https://angular.io/guide/pipes#appendix-no-filterpipe-or-orderbypipe

You can try something like this:

ngOnInit() {
    this.sortedItems = items.sort((a: any, b: any) =>
        new Date(a.date).getTime() - new Date(b.date).getTime()
    );
}

Upvotes: 21

Related Questions