Compear

Compear 🍐🤷🍐

Utilities for comparing and sorting with comparators in JavaScript

Documentation

NPM Version

npm install compear

Let's look at an example. Suppose you have a list of objects...

const people = [
{ firstName: "Tina", lastName: "Ham" },
{ firstName: "Bob", lastName: "Builder" },
{ firstName: "Lewis", lastName: "Mayor" },
];

...and you want to sort the array alphabetically by the "lastName" property.

Without Compear, you can write:

const peopleSorted = people.toSorted((personA, personB) => {
if (personA.lastName < personB.lastName) {
return -1;
} else if (personA.lastName > personB.lastName) {
return 1;
} else {
return 0;
}
});

With Compear, you can write:

const peopleSorted = people.toSorted(compareBy((person) => person.lastName));

Both examples use the array.toSorted(..) function that is built-in to JavaScript. The difference is in how you write the function that is passed as an argument to array.toSorted(..). This kind of function is called a comparator. Creating and using comparators is what Compear is all about.

Compear is written in TypeScript and provides strong type safety.

naturalOrder is meant to be a sensible default comparator for many cases. It works well for comparing numbers, strings, Dates, or lists of these values. For other types of values, you will probably need to create a more specific comparator.

In some of the provided functions (such as compareBy), Compear uses naturalOrder by default, but allows you to provide a different comparator if needed.

The compareBy function can create a comparator that selects a specific property to compare, or somehow derives another value to be compared.

compareWith chains together multiple comparators. This is useful when you want to: "sort by X, but if X is equal, then sort by Y, etc."

These functions find the smallest or largest value from a list of values using any given comparator.

See the documentation for more.

Here are some examples of what you can do with Compear:

import { compareBy, compareByDesc, compareWith, minWith } from "compear";

const heros = [
{
name: "Frozone",
age: 37,
favoriteColor: "blue",
},
{
name: "Stupendous Man",
age: 9,
favoriteColor: "red",
},
{
name: "Iron Man",
age: 44,
favoriteColor: "gold",
},
];

const youngestHero = minWith(heros, compareBy("age"))

const sortedByName = heros.sort(compareBy("name"));

const sortedByNameAndGoldFirst = heros.toSorted(
compareWith(
compareByDesc("favoriteColor", (color) => color === "gold"),
compareBy("name"),
)
);

Compear takes some inspiration from Kotlin's kotlin.comparisons package, but is designed for JavaScript.

Compear embraces functional programming to a certain extent. It prioritizes the treatment of comparator functions as first-class citizens especially because they are highly composable and re-usable in practical applications. On the other hand, some functions have a chosen parameter order that prioritizes readability over the possibility of currying.