CommonSenseCode
CommonSenseCode

Reputation: 25369

TypeScript sort by date not working

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?

Upvotes: 96

Views: 146813

Answers (4)

Phoenix
Phoenix

Reputation: 1139

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

Unary plus (+) converts an operand ( new Date() ) into a number.

Upvotes: 57

Valentin  Kononov
Valentin Kononov

Reputation: 101

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

Upvotes: 9

RnDrx
RnDrx

Reputation: 250

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

Upvotes: 8

Nitzan Tomer
Nitzan Tomer

Reputation: 164129

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

Upvotes: 143

Related Questions