Object utils
import { pick, get, deepMerge } from '@gg-software/utils';pick / omit
New object with only / without the given keys.
pick({ a: 1, b: 2, c: 3 }, ['a', 'c']); // { a: 1, c: 3 }
omit({ a: 1, b: 2, c: 3 }, ['b']); // { a: 1, c: 3 }get
Safe nested read via a dot path; numeric segments index arrays.
get(user, 'address.city'); // "Praha" | undefined
get(order, 'items.0.name', 'n/a'); // fallback when missing
get(obj, ['a', 'b', 0]); // array path form| Parameter | Type | Default |
|---|---|---|
obj | unknown | — |
path | string | (string | number)[] | — |
fallback | T | undefined |
set
Nested write via a dot path — mutates obj, creating intermediate objects (or arrays
for numeric segments). Returns obj.
set({}, 'a.b.c', 1); // { a: { b: { c: 1 } } }
set({}, 'items.0.name', 'x'); // { items: [{ name: "x" }] }deepMerge
Recursive merge of plain objects — later sources win, plain objects merge deep, everything else (arrays included) is replaced. Non-mutating.
deepMerge({ a: { x: 1 } }, { a: { y: 2 } }); // { a: { x: 1, y: 2 } }
deepMerge({ tags: ['a'] }, { tags: ['b'] }); // { tags: ["b"] }
deepMerge(defaults, savedSettings, overrides);deepClone
Deep clone via structuredClone — handles Dates, Maps, Sets, nested structures. Functions
are not cloneable (throws, per the platform).
const copy = deepClone(state);isEmpty
null/undefined, '', [], {}, empty Map/Set → true. Numbers and booleans are
never empty.
isEmpty(null); // true
isEmpty(''); // true
isEmpty([]); // true
isEmpty({}); // true
isEmpty(0); // false
isEmpty({ a: 1 }); // false