Skip to content

Latest commit

 

History

History

compare

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

compare

npm version npm downloads Twitter Follow

This project is part of the @thi.ng/umbrella monorepo.

About

Comparators with optional support for types implementing the @thi.ng/api ICompare interface.

Since v1.2.0 additional higher-order comparators are included, e.g. to reverse the ordering of an existing comparator and allow hierarchical sorting by multiple keys/dimensions, each with their own optional comparator. See examples below.

Status

STABLE - used in production

Search or submit any issues for this package

Installation

yarn add @thi.ng/compare

ES module import:

<script type="module" src="https://cdn.skypack.dev/@thi.ng/compare"></script>

Skypack documentation

For Node.js REPL:

# with flag only for < v16
node --experimental-repl-await

> const compare = await import("@thi.ng/compare");

Package sizes (gzipped, pre-treeshake): ESM: 396 bytes

Dependencies

Usage examples

Several demos in this repo's /examples directory are using this package.

A selection:

Screenshot Description Live demo Source
Color palette generation via dominant color extraction from uploaded images Demo Source
Full umbrella repo doc string search w/ paginated results Demo Source
Triple store query results & sortable table Demo Source

API

Generated API docs

ICompare support

import { ICompare } from "@thi.ng/api";
import { compare } from "@thi.ng/compare";

class Foo implements ICompare<Foo> {

    x: number;

    constructor(x: number) {
        this.x = x;
    }

    compare(o: Foo) {
        return compare(this.x, o.x);
    }
}

compare(new Foo(1), new Foo(2));
// -1

Cluster sort w/ multiple sort keys

Key-based object comparison is supported for 1 - 4 keys / dimensions.

import * as cmp from "@thi.ng/compare";

const src = [
    { id: "charlie", age: 66 },
    { id: "bart", age: 42 },
    { id: "alice", age: 23 },
    { id: "dora", age: 11 },
];

// cluster sort by id -> age (default comparators)
[...src].sort(cmp.compareByKeys2("id", "age"));
// [
//   { id: 'alice', age: 23 },
//   { id: 'bart', age: 42 },
//   { id: 'charlie', age: 66 },
//   { id: 'dora', age: 11 }
// ]

// cluster sort by age -> id (default comparators)
[...src].sort(cmp.compareByKeys2("age", "id"));
// [
//   { id: 'dora', age: 11 },
//   { id: 'alice', age: 23 },
//   { id: 'bart', age: 42 },
//   { id: 'charlie', age: 66 }
// ]

// cluster sort by age -> id
// (custom comparator for `age` key)
[...src].sort(cmp.compareByKeys2("age", "id", cmp.compareNumDesc));
// [
//   { id: 'charlie', age: 66 },
//   { id: 'bart', age: 42 },
//   { id: 'alice', age: 23 },
//   { id: 'dora', age: 11 }
// ]

// using `reverse()` comparator for `id`
[...src].sort(cmp.compareByKeys2("age", "id", cmp.compare, cmp.reverse(cmp.compare)));
// [
//   { id: 'dora', age: 11 },
//   { id: 'alice', age: 23 },
//   { id: 'bart', age: 42 },
//   { id: 'charlie', age: 66 }
// ]

Authors

Karsten Schmidt

If this project contributes to an academic publication, please cite it as:

@misc{thing-compare,
  title = "@thi.ng/compare",
  author = "Karsten Schmidt",
  note = "https://thi.ng/compare",
  year = 2016
}

License

© 2016 - 2021 Karsten Schmidt // Apache Software License 2.0