Mat Sort Issue for Numbers and Text Columns
Asked Answered
I

3

7

I have angular material datasource. angular material version is ^5.0.3 Sorting is working. However for some columns it is sorting incorrectly. where number and text is there. For instance, sorted result like, 'XXX', '1', '1tesxt', '1', 'OPD', OXD', '12'.

<mat-table #table [dataSource]="dataSource" matSort > 
  <ng-container matColumnDef="model">
    <mat-header-cell *matHeaderCellDef mat-sort-header> Model </mat-header-cell>
    <mat-cell *matCellDef="let element"> {{element.model}} </mat-cell>
  </ng-container>

Appreciate your help.

Ivar answered 28/3, 2018 at 6:44 Comment(0)
A
8

This is because the standard sortingDataAccessor casts number strings to number and in Javascript 1 > 'one' and 1 < 'one' both evaluates to false.

As a workaround, you can define your own sortingDataAccessor without the cast:

ngAfterViewInit() {    
  this.dataSource.sort = this.sort;
  this.dataSource.sortingDataAccessor = (data, attribute) => data[attribute];
}

The workaround is copied from this Github issue.

Agitato answered 28/3, 2018 at 20:51 Comment(0)
O
1
this.dataSource.sortingDataAccessor = (item, property) => ['length', 'age'].includes(property) ? +item[property] : item[property];
Oil answered 13/1, 2022 at 19:54 Comment(0)
F
0

You need to take out those characters that are not numbers and convert the string that is holding the numeric characters to a numeric type value.

Your initial column value: 'ID0239'. After taking out the characters: '0239'. After converting the string to number: 0239.

And 0239 is the value you need to return inside the sortingDataAccessor function.

Fog answered 14/4, 2019 at 13:16 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.