Creates a comparator function for numerical sorting with multi-value support.

Generates a comparator that extracts numerical values from objects and performs mathematical comparison. Supports both single numbers and arrays of numbers for complex numerical sorting scenarios like sorting by price then by rating.

When comparing arrays, performs lexicographic numerical ordering: compares the first numbers, then the second numbers if the first are equal, and so on. This enables sophisticated sorting like "sort by price ascending, then by rating descending".

  interface Product {
id: string;
name: string;
price: number;
rating: number;
stock: number;
categoryId: number;
salesCount: number;
}

const products: Product[] = [
{ id: '1', name: 'Laptop', price: 999.99, rating: 4.5, stock: 15, categoryId: 1, salesCount: 150 },
{ id: '2', name: 'Mouse', price: 29.99, rating: 4.2, stock: 50, categoryId: 1, salesCount: 300 },
{ id: '3', name: 'Keyboard', price: 79.99, rating: 4.8, stock: 25, categoryId: 1, salesCount: 200 }
];

// Sort by price (ascending)
products.sort(GaffComparator.numbers(product => product.price));
// Result: Mouse ($29.99), Keyboard ($79.99), Laptop ($999.99)

// Sort by rating (descending requires negation)
products.sort(GaffComparator.numbers(product => -product.rating));
// Result: Keyboard (4.8), Laptop (4.5), Mouse (4.2)

// Multi-field: category, then price
products.sort(GaffComparator.numbers(product => [product.categoryId, product.price]));

// Complex business logic: popularity (sales) then rating
products.sort(GaffComparator.numbers(product => [-product.salesCount, -product.rating]));
// Negative values for descending order

// Sort by inventory priority: low stock first, then by sales
products.sort(GaffComparator.numbers(product => [product.stock, -product.salesCount]));

// Validate API numerical sorting
await TestValidator.sort("product price sorting")(
(sortFields) => productApi.getProducts({ sort: sortFields })
)("price")(
GaffComparator.numbers(product => product.price)
)("+");

// Test multi-criteria sorting
const sortByBusinessValue = GaffComparator.numbers(product => [
-product.salesCount, // High sales first
-product.rating, // High rating first
product.price // Low price first (for tie-breaking)
]);
  • Type Parameters

    • T

      The type of objects being compared

    Parameters

    • closure: (input: T) => number | number[]

      Function that extracts number value(s) from input objects

    Returns (x: T, y: T) => number

    A comparator function suitable for Array.sort()