From 1aa441fb05917ad75aede548ba3b84fbf36caf64 Mon Sep 17 00:00:00 2001 From: "netop://ウィビ" Date: Sat, 11 Apr 2026 14:45:40 -0700 Subject: initial commit --- mod.ts | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 mod.ts (limited to 'mod.ts') diff --git a/mod.ts b/mod.ts new file mode 100644 index 0000000..178302b --- /dev/null +++ b/mod.ts @@ -0,0 +1,52 @@ + + + +//// util + +type OrderableValue = string | number | boolean | null | undefined | OrderableObject | OrderableValue[]; + +interface OrderableObject { + [key: string]: OrderableValue; +} + + + +//// export + +/** + * Recursively orders an object's keys and its nested objects alphabetically + * ```ts + * import { orderObject } from "jsr:@netopwibby/order-object"; + * + * console.log(orderObject({ zebra: "yay", 1: "neo", horse: "neigh" })); + * // returns { "1": "neo", horse: "neigh", zebra: "yay" } + * + * @param value - The value to order (object, array, or primitive) + * @returns The ordered value, or the original value if not orderable + */ +export function orderObject(value?: T): T | null { + if (value === null || value === undefined) + return null; + + if (Array.isArray(value)) // recursively order array elements + return value.map(item => orderObject(item)) as T; + + if (typeof value !== "object") + return value; + + const sortedKeys = Object.keys(value).sort(); + + // recursively order key values + const orderedObject = sortedKeys.reduce((result, key) => { + const currentValue = (value as OrderableObject)[key]; + result[key] = orderObject(currentValue); + + return result; + }, {}); + + // preserve original object's prototype + return Object.setPrototypeOf( + orderedObject, + Object.getPrototypeOf(value) + ) as T; +} -- cgit v1.2.3