Compare strings containing a mix of letters and numbers in the way a human being would in sort order.
npx @tessl/cli install tessl/npm-natural-compare-lite@1.4.0Natural Compare Lite provides natural string comparison that handles mixed letters and numbers in human-readable sort order. It sorts strings the way humans expect, treating numbers within strings numerically rather than lexicographically (e.g., "img10.png" comes after "img2.png", not before).
npm install natural-compare-liteCommonJS (default):
const naturalCompare = require("natural-compare-lite");ES modules (with bundler/transpiler):
import naturalCompare from "natural-compare-lite";Browser (global):
<script src="path/to/natural-compare-lite"></script>
<script>
// Access via String.naturalCompare when CommonJS is unavailable
const naturalCompare = String.naturalCompare;
</script>const naturalCompare = require("natural-compare-lite");
// Simple array sorting
const files = ["z1.doc", "z10.doc", "z17.doc", "z2.doc", "z23.doc", "z3.doc"];
files.sort(naturalCompare);
// Result: ["z1.doc", "z2.doc", "z3.doc", "z10.doc", "z17.doc", "z23.doc"]
// Case insensitive sorting
const names = ["Alice", "bob", "Charlie"];
names.sort((a, b) => naturalCompare(a.toLowerCase(), b.toLowerCase()));
// Object sorting by property
const items = [
{ street: "350 5th Ave", room: "A-1021" },
{ street: "350 5th Ave", room: "A-21046-b" }
];
items.sort((a, b) =>
naturalCompare(a.street, b.street) || naturalCompare(a.room, b.room)
);Compares two strings containing mixed letters and numbers in natural (human-readable) order.
/**
* Compare two strings in natural order
* @param {string|any} a - First string to compare (non-strings are converted to strings)
* @param {string|any} b - Second string to compare (non-strings are converted to strings)
* @returns {number} -1 if a < b, 0 if a === b, 1 if a > b
*/
function naturalCompare(a, b);The function handles:
Usage Examples:
// Basic comparison
naturalCompare("a1", "a2"); // -1 (a1 comes before a2)
naturalCompare("a10", "a2"); // 1 (a10 comes after a2)
naturalCompare("same", "same"); // 0 (strings are equal)
// Numeric sequences
naturalCompare("file1.txt", "file10.txt"); // -1
naturalCompare("version1.2", "version1.10"); // -1
// With JavaScript's sort method
["img1.png", "img10.png", "img2.png"].sort(naturalCompare);
// Result: ["img1.png", "img2.png", "img10.png"]
// Decimal numbers
naturalCompare("1.01", "1.001"); // 1 (maintains decimal precision)
naturalCompare("1.001", "1.01"); // -1Configure custom character ordering for internationalization by setting the global String.alphabet property.
/**
* Global alphabet configuration for custom character ordering
* @type {string|undefined}
*/
String.alphabet;Usage Examples:
// Estonian alphabet
String.alphabet = "ABDEFGHIJKLMNOPRSŠZŽTUVÕÄÖÜXYabdefghijklmnoprsšzžtuvõäöüxy";
["t", "z", "x", "õ"].sort(naturalCompare);
// Result: ["z", "t", "õ", "x"] (follows Estonian ordering)
// Russian alphabet
String.alphabet = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя";
["Ё", "А", "Б"].sort(naturalCompare);
// Result: ["А", "Б", "Ё"] (follows Russian ordering)
// Reset to default behavior
String.alphabet = undefined;In browser environments where CommonJS modules aren't available, the function is attached to String.naturalCompare.
/**
* Browser-compatible reference to naturalCompare function
* Available when CommonJS modules are not supported
* @type {function}
*/
String.naturalCompare;Usage Example:
<script src="natural-compare-lite.js"></script>
<script>
// Use String.naturalCompare in browser environments
const files = ["file1.txt", "file10.txt", "file2.txt"];
files.sort(String.naturalCompare);
// Result: ["file1.txt", "file2.txt", "file10.txt"]
</script>/**
* Natural comparison function type
* @param {string} a - First string to compare
* @param {string} b - Second string to compare
* @returns {number} Comparison result: -1, 0, or 1
*/
type naturalCompare = (a: string, b: string) => number;