Reputation: 25369
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
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
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
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
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:
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