This is an Angular pipe called ngxDynamicOrder
that can sort an array of objects by a property of the object dynamically at runtime. It allows sorting by single or multiple properties, case sensitivity, and custom comparator functions.
To install this library, run:
npm i ngx-dynamic-order
-
Import the
NgxDynamicOrder
class from the pipe file:import { NgxDynamicOrder } from './ngx-dynamic-order.pipe';
-
Add the
NgxDynamicOrder
to thedeclarations
array of the module in which you want to use the pipe:@NgModule({ declarations: [NgxDynamicOrder], // ... }) export class AppModule { }
-
Use the
ngxDynamicOrder
pipe in your component's template:<ul> <li *ngFor="let item of items | ngxDynamicOrder: expression: reverse: isCaseInsensitive: comparator">{{item.name}}</li> </ul>
expression: string | string[]
: The property or properties of the objects to sort by. It can be a single string, or an array of strings if sorting by multiple properties. You can use dot notation to access nested properties of objects.reverse?: boolean
: Set totrue
to sort the array in reverse order. Defaults tofalse
.isCaseInsensitive?: boolean
: Set totrue
to sort the array ignoring the case of strings. Defaults tofalse
.comparator?: Function
: A custom comparator function to use for sorting. It takes two arguments and should return a number less than 0, 0, or a number greater than 0 depending on the desired sort order.
The NgxDynamicOrder
class also provides several utility methods that can be used independently of the pipe:
isString(value: any): boolean
: Returns true if the value is a string, false otherwise.caseInsensitiveSort(a: any, b: any)
: Compares two values case-insensitively.defaultCompare(a: any, b: any)
: The default comparison function used for sorting. It handles null, undefined, and Date objects correctly.parseExpression(expression: string): string[]
: Parses a string expression into an array of property names.getValue(object: any, expression: string[]): any
: Retrieves a value from an object using a property expression.setValue(object: any, value: any, expression: string[])
: Sets a value on an object using a property expression.
const items = [
{ name: 'John', age: 30, country: { code: 'us', name: 'United States' } },
{ name: 'Alice', age: 25, country: { code: 'ca', name: 'Canada' } },
{ name: 'Bob', age: 35, country: { code: 'gb', name: 'United Kingdom' } }
];
const pipe = new NgxDynamicOrder();
// Sort by name
const sortedByName = pipe.transform(items, 'name');
// Sort by country code, then by age
const sortedByCountryAndAge = pipe.transform(items, ['country.code', 'age']);
// Sort by name in reverse order
const sortedByNameReversed = pipe.transform(items, 'name', true);
// Sort ignoring case
const sortedByNameIgnoreCase = pipe.transform(items, 'name', false, true);