|
|
|
@ -7,21 +7,26 @@ export type SortOrder = 'asc' | 'desc'; |
|
|
|
export class SortPipe implements PipeTransform { |
|
|
|
transform(value: any[], sortOrder: SortOrder | string = 'asc', sortKey?: string): any { |
|
|
|
sortOrder = sortOrder && (sortOrder.toLowerCase() as any); |
|
|
|
|
|
|
|
if (!value || (sortOrder !== 'asc' && sortOrder !== 'desc')) return value; |
|
|
|
let sorted; |
|
|
|
|
|
|
|
let numberArray = []; |
|
|
|
let stringArray = []; |
|
|
|
|
|
|
|
if (!sortKey) { |
|
|
|
const numberArray = []; |
|
|
|
const stringArray = []; |
|
|
|
value.forEach(item => (typeof item === 'number' ? numberArray.push(item) : stringArray.push(item))); |
|
|
|
sorted = numberArray.sort().concat(stringArray.sort()); |
|
|
|
numberArray = value.filter(item => typeof item === 'number').sort(); |
|
|
|
stringArray = value.filter(item => typeof item === 'string').sort(); |
|
|
|
} else { |
|
|
|
sorted = value.sort((a, b) => { |
|
|
|
return ( |
|
|
|
Number(typeof b[sortKey] === 'number') - Number(typeof a[sortKey] === 'number') || |
|
|
|
(a[sortKey] < b[sortKey] ? -1 : 1) |
|
|
|
); |
|
|
|
}); |
|
|
|
numberArray = value.filter(item => typeof item[sortKey] === 'number').sort((a, b) => a[sortKey] - b[sortKey]); |
|
|
|
stringArray = value |
|
|
|
.filter(item => typeof item[sortKey] === 'string') |
|
|
|
.sort((a, b) => { |
|
|
|
if (a[sortKey] < b[sortKey]) return -1; |
|
|
|
else if (a[sortKey] > b[sortKey]) return 1; |
|
|
|
else return 0; |
|
|
|
}); |
|
|
|
} |
|
|
|
const sorted = numberArray.concat(stringArray); |
|
|
|
return sortOrder === 'asc' ? sorted : sorted.reverse(); |
|
|
|
} |
|
|
|
} |
|
|
|
|