sorting in angular 14

 based on pipe sorting


import { Pipe, PipeTransform } from '@angular/core';
export type SortOrder = 'asc' | 'desc';
@Pipe({
  name: 'tableSorting'
})
export class TableSortingPipe implements PipeTransform {
   
 
  public sortByTab:  any;


  transform(value: any[], sortOrder: SortOrder | string = 'asc', sortKey?: any): any {
    let sortArrayData = value;
     this.sortByTab = (a: any, b: any) => {
      const isNumber = (v: any) => Number(v).toString() === v;
      const aPart = a[sortKey].toString().match(/\d+|\D+/g);
      const bPart = b[sortKey].toString().match(/\d+|\D+/g);
      let i = 0;
      const len = Math.min(aPart.length, bPart.length);
      while (i < len && aPart[i] === bPart[i]) {
        i++;
      }

      if (i === len) {
        return sortOrder === 'asc'
          ? bPart.length - aPart.length
          : aPart.length - bPart.length;
      }

      if (isNumber(aPart[i]) && isNumber(bPart[i])) {
        return sortOrder === 'asc'
          ? bPart[i] - aPart[i]
          : aPart[i] - bPart[i];
      }

      return sortOrder === 'asc'
        ? bPart[i].localeCompare(aPart[i])
        : aPart[i].localeCompare(bPart[i]);
    };
    sortArrayData.sort(this.sortByTab);
    return sortArrayData;    
  }
}
 private getKeyByValue(object: any, value: any) {
    return Object.keys(object).find((key) => object[key] === value);
  }
  public sortElement(event: any, column: string){
    const requestheaders = {
      job: 'Job#',
      jobOwner:"Job Owner",
      case:"Case",
      specimen:"Specimen",
      slideId:"Slide Id",
      algorithmName:"Algorithm Name",
      algorithmVersion:"Algorithm Version",
      vendor:"Vendor",
      regularityStatus:"Regulatory Status",
      testType:"Test Type",
      startDateTime:"Start Date Time",
      completion:"Completion"
    };
    this.objkey = this.getKeyByValue(requestheaders, column);
    this.inProgressData=this.sorting.transform
(this.inProgressData,event.detail,this.objkey);
     
  }
based on function sorting use below code


import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root'
})
export class TableSortingService {
  public isAscending: any;
  public objkey: any;
  public sortByTab: any;
  constructor() { }
  public getKeyByValue(object: any, value: any) {
    console.log(object, value);
    return Object.keys(object).find((key) => object[key] === value);
  }

  public sortElement(event: any, column: string, headers: any, array: any) {
    let sortArrayData = array;
    this.isAscending = event.detail;
    this.objkey = this.getKeyByValue(headers, column);
    this.sortByTab = (a: any, b: any) => {
      const isNumber = (v: any) => Number(v).toString() === v;
      // eslint-disable-next-line require-unicode-regexp
      const aPart = a[this.objkey].toString().match(/\d+|\D+/g);
      // eslint-disable-next-line require-unicode-regexp
      const bPart = b[this.objkey].toString().match(/\d+|\D+/g);
      let i = 0;
      const len = Math.min(aPart.length, bPart.length);
      while (i < len && aPart[i] === bPart[i]) {
        i++;
      }

      if (i === len) {
        return this.isAscending === 'asc'
          ? bPart.length - aPart.length
          : aPart.length - bPart.length;
      }

      if (isNumber(aPart[i]) && isNumber(bPart[i])) {
        return this.isAscending === 'asc'
          ? bPart[i] - aPart[i]
          : aPart[i] - bPart[i];
      }

      return this.isAscending === 'asc'
        ? bPart[i].localeCompare(aPart[i])
        : aPart[i].localeCompare(bPart[i]);
    };
    sortArrayData.sort(this.sortByTab);
    return sortArrayData;

  }
}





Comments

Popular posts from this blog

how to split array as per fixed length, and ionic two dates differences in min,seconds,hours

How to Add Firebase Analytics to Your NativeScript Mobile App