简体   繁体   中英

Customsort function for sorting date column not working

Can someone help me with my customSort function for primeng table column sorting? I have a Date column in my table which gets data from array of strings which i formated to 'hh:mm a' and its not sorting as i want it to sort (instead of sorting like 1am, 2am, 3am etc its currently sorting like 1am,1pm,10am,10pm, ... etc) i came up with this customSort function but its still giving me same result and everything else in my table sorts just fine with this customSort except the date column. Any help please?

customSort(event: SortEvent) {
    event.data.sort((data1, data2) => {
      let value1 = data1[event.field];
      let value2 = data2[event.field];
      let result = null;
      if (value1 == null && value2 != null) {
        result = -1;
      } else if (value1 != null && value2 == null) {
        result = 1;
      } else if (value1 == null && value2 == null) {
        result = 0;
      } else if (typeof value1 === 'string' && typeof value2 === 'string') {
        const time1 = Date.parse('1970-01-01 ' + value1);
        const time2 = Date.parse('1970-01-01 ' + value2);
        console.log(value1);

        if (time1 < time2) {
          result = -1;
        } else if (time1 > time2) {
          result = 1;
        } else {
          result = 0;
        }
      } else {
        result = value1 < value2 ? -1 : value1 > value2 ? 1 : 0;
      }
      return event.order * result;
    });
  }

in html table i added this attribute

code...
...
 [customSort]="true"
(sortFunction)="customSort($event)"
...code

i have done some changes but still same sorting result

customSort(event: SortEvent) {
    event.data.sort((data1, data2) => {
      let value1 = data1[event.field];
      let value2 = data2[event.field];
      let result = null;
      if (value1 == null && value2 != null) {
        result = -1;
      } else if (value1 != null && value2 == null) {
        result = 1;
      } else if (value1 == null && value2 == null) {
        result = 0;
      } else {
        const time1 = new Date(`1970-01-01 ${value1.padStart(5, '0')}`);
        const time2 = new Date(`1970-01-01 ${value2.padStart(5, '0')}`);
        const timestamp1 = time1.getTime();
        const timestamp2 = time2.getTime();
        if (timestamp1 < timestamp2) {
          result = -1;
        } else if (timestamp1 > timestamp2) {
          result = 1;
        } else {
          result = 0;
        }
      }
      return event.order * result;
    });
  }

why not add a new property "minutes" like

data.forEach(x=>{
   const values=x.date?x.date.split(' '):null;
   const hourMinutes=values?values[0].split(":"):null;
   x.minutes=hourMinutes?(+hourMinutes[0])*60+(+hourMinutes[1]):-999
   if (values && values[1]=="pm")
       x.minutes+=12*60
})

Then, the only is sorted by minutes

<ng-container matColumnDef="date" >
    <th mat-header-cell *matHeaderCellDef mat-sort-header="minutes"> 
       Date
    </th>
    <td mat-cell *matCellDef="let element"> {{element.date}} </td>
</ng-container>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM