64
votes

I have an object TaskItemVO with field dueDate which has the type Date:

export class TaskItemVO {
    
    public dueDate: Date;
}

I have this method which I call when I try to sort by date but it is not working:

public sortByDueDate(): void {
    this.myArray.sort((a: TaskItemVO, b: TaskItemVO) => {
        return a.dueDate - b.dueDate;

    });
}

I get this error in the return line of method:

The right-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type.

The left-hand side of an arithmetic operation must be of type 'any', 'number' or an enum type.

So what is the correct way of sorting array by date fields in TypeScript?

4
As the error message shows, you need to convert the dates into numbers.ssube
If it can be undefined, the class should probably note that in its signature, public dueDate?: Date;Heretic Monkey

4 Answers

91
votes

Try using the Date.getTime() method:

public sortByDueDate(): void {
    this.myArray.sort((a: TaskItemVO, b: TaskItemVO) => {
        return a.dueDate.getTime() - b.dueDate.getTime();

    });
}

^ Above throws error with undefined date so try below:


Edit

If you want to handle undefined:

private getTime(date?: Date) {
    return date != null ? date.getTime() : 0;
}


public sortByDueDate(): void {
    this.myArray.sort((a: TaskItemVO, b: TaskItemVO) => {
        return this.getTime(a.dueDate) - this.getTime(b.dueDate);
    });
}
36
votes

As possible workaround you can use unary + operator here:

public sortByDueDate(): void {
    this.myArray.sort((a: TaskItemVO, b: TaskItemVO) => {
        return +new Date(a.dueDate) - +new Date(b.dueDate);
    });
}
6
votes

If you are running into issues with the accepted answer above. I got it to work by creating a new Date and passing in the date parameter.

  private getTime(date?: Date) {
    return date != null ? new Date(date).getTime() : 0;
  }

  public sortByStartDate(array: myobj[]): myobj[] {
    return array.sort((a: myobj, b: myobj) => {
      return this.getTime(a.startDate) - this.getTime(b.startDate);
    });
  }
6
votes

I believe it's better to use valueOf

public sortByDueDate(): void {
    this.myArray.sort((a: TaskItemVO, b: TaskItemVO) => {
        return a.dueDate.valueOf() - b.dueDate.valueOf();
    });
}

according to docs: /** Returns the stored time value in milliseconds since midnight, January 1, 1970 UTC. */