Sort the keys in an object. TypeScript-first, ESM, maintained fork of sort-object.
- ✅ TypeScript — Full type definitions included
- ✅ ESM — Native ES modules with
type: "module" - ✅ Maintained — Active maintenance, modern tooling (vitest, eslint 9)
- ✅ New features — Deep/recursive sort, input validation
- ✅ Node 20+ — Modern engine target
npm i @znemz/sort-objectimport sortObj from "@znemz/sort-object";
// or: import { sort } from "@znemz/sort-object";
const sorted = sortObj({ a: 1, c: 2, b: 3 });
// => { a: 1, b: 3, c: 2 }import sortObj, { type SortOptions } from "@znemz/sort-object";
const options: SortOptions = {
sortOrder: "desc",
};
sortObj({ a: 1, c: 2, b: 3 }, options);
// => { c: 2, b: 3, a: 1 }Returns a new object with sorted keys (does not mutate the original).
| Option | Type | Description |
|---|---|---|
keys |
string[] |
Only include these keys, in this order |
sort |
(a, b) => number |
Custom sort function for keys |
sortOrder |
'asc' | 'desc' |
Sort direction (case insensitive) |
sortBy |
(obj) => string[] |
Function returning array of keys to sort by |
prop |
string |
Property path to sort by (for nested values) |
get |
(val, prop?) => unknown |
Custom getter for sort values |
deep |
boolean |
Recursively sort nested objects |
The second parameter can also be an array of keys (shorthand for { keys: [...] }):
sortObj({ a: 1, c: 2, b: 3 }, ["c", "a", "b"]);
// => { c: 2, a: 1, b: 3 }Create a new object with only the given keys:
sortObj({ a: 1, c: 2, e: 5, d: 4, b: 3 }, { keys: ["a", "b"] });
// => { a: 1, b: 3 }Custom sort function passed to JavaScript's .sort():
sortObj({ a: 1, c: 2, e: 5, d: 4, b: 3 }, {
sort: (a, b) => (a < b ? -1 : 1),
});
// => { a: 1, b: 3, c: 2, d: 4, e: 5 }Sort ascending or descending:
sortObj({ a: 1, c: 2, b: 3 }, { sortOrder: "desc" });
// => { c: 2, b: 3, a: 1 }Function that returns an array of keys to sort by:
const old = { one: "aa", two: "bc", three: "ab" };
sortObj(old, {
sortBy: (obj) =>
Object.keys(obj)
.filter((key) => /^a/.test(obj[key] as string))
.reverse(),
});
// => { three: 'ab', one: 'aa' }Recursively sort nested objects:
sortObj(
{ c: { z: 1, a: 2 }, a: { y: 3, b: 4 } },
{ deep: true },
);
// => { a: { b: 4, y: 3 }, c: { a: 2, z: 1 } }- Immutable: Always returns a new object; the input is never mutated.
- Input validation: Throws
TypeErrorfor non-object inputs (null, arrays, primitives). - Prototype-safe: Only own properties are sorted; inherited properties are ignored.
Brian Woodward — github/doowb
Nick McCready — github/nmccready
MIT © Brian Woodward, Nick McCready