Skip to main content

mergeDeepLeft()

mergeDeepLeft<T, U>(left, right): T & U

Recursively merges objects, with left values taking precedence.

note

Arrays are replaced, not merged.


Type Parametersโ€‹

T: T extends AnyRecordโ€‹

The type of the left object.

U: U extends AnyRecordโ€‹

The type of the right object.


Parametersโ€‹

left: Tโ€‹

The left object (takes precedence).

right: Uโ€‹

The right object (fallback values).


Returns: T & Uโ€‹

A new deeply merged object.


See Alsoโ€‹

mergeDeepRight


Sinceโ€‹

2.0.0


Noteโ€‹

Symbol keys are included via Reflect.ownKeys.


Performanceโ€‹

O(n) time & space where n is total number of properties. Early returns for null/undefined/primitives/arrays. Uses spread operator for shallow copy.


Exampleโ€‹

const left = { user: { name: 'John', age: 30 } };
const right = { user: { name: 'Jane', email: 'jane@example.com' } };

mergeDeepLeft(left, right);
// => { user: { name: 'John', age: 30, email: 'jane@example.com' } }

// Arrays: left wins
mergeDeepLeft({ items: [1, 2] }, { items: [3, 4] });
// => { items: [1, 2] }

Use Casesโ€‹

Merge with default precedence ๐Ÿ“Œโ€‹

Merge objects recursively where the first object (left) keeps its values if conflicts occur. Useful for preserving original state while filling in gaps.

const result = mergeDeepLeft(defaults, overrides);
// defaults are kept, overrides only add new keys

Preserve initialization dataโ€‹

Merge new data into an object, but refuse to overwrite any existing values. Useful for "fill only if empty" logic.

const session = { id: 123 };
const newInfo = { id: 456, name: 'Guest' };
const result = mergeDeepLeft(session, newInfo);
// { id: 123, name: 'Guest' } - id preserved

Fill missing dataโ€‹

Populate a sparse object with data from a complete template. Useful for restoring partial backups or checking schema compliance.

const complete = mergeDeepLeft(template, partialData);