TypeScript sort by date not working

SortingTypescript

Sorting Problem Overview


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?

Sorting Solutions


Solution 1 - Sorting

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);
    });
}

Solution 2 - Sorting

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);
    });
}

Solution 3 - Sorting

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);
    });
  }

Solution 4 - Sorting

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. */

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionCommonSenseCodeView Question on Stackoverflow
Solution 1 - SortingNitzan TomerView Answer on Stackoverflow
Solution 2 - SortingPhoenixView Answer on Stackoverflow
Solution 3 - SortingRnDrxView Answer on Stackoverflow
Solution 4 - SortingValentin KononovView Answer on Stackoverflow