DeepMerge
import { DeepMerge } from "jsr:@ende/collections";type alias
type DeepMerge<T, U, Options = Record<string, MergingStrategy>> = [T, U] extends [Record<PropertyKey, unknown>, Record<PropertyKey, unknown>] ? Merge<T, U, Options> : T | UMerge deeply two objects
deepMerge
import { deepMerge } from "jsr:@ende/collections";function
function deepMerge<T extends Record<PropertyKey, unknown>>(record: Partial<Readonly<T>>, other: Partial<Readonly<T>>, options?: Readonly<DeepMergeOptions>): TMerges the two given records, recursively merging any nested records with the second collection overriding the first in case of conflict.
For arrays, maps and sets, a merging strategy can be specified to either
replace values, or merge them instead.
record: Partial<Readonly<T>>First record to merge.
other: Partial<Readonly<T>>Second record to merge.
options?: Readonly<DeepMergeOptions>Merging options.
Returns
A new record with the merged values.
Example: Merge objects
import { deepMerge } from "@ende/collections/deep-merge";
import { assertEquals } from "@ende/assert";
const a = { foo: true };
const b = { foo: { bar: true } };
const result = deepMerge(a, b);
const expected = { foo: { bar: true } };
assertEquals(result, expected);
Example: Merge arrays
import { deepMerge } from "@ende/collections/deep-merge";
import { assertEquals } from "@ende/assert";
const a = { foo: [1, 2] };
const b = { foo: [3, 4] };
const result = deepMerge(a, b);
const expected = { foo: [1, 2, 3, 4] };
assertEquals(result, expected);
Example: Merge maps
import { deepMerge } from "@ende/collections/deep-merge";
import { assertEquals } from "@ende/assert";
const a = { foo: new Map([["a", 1]]) };
const b = { foo: new Map([["b", 2]]) };
const result = deepMerge(a, b);
const expected = { foo: new Map([["a", 1], ["b", 2]]) };
assertEquals(result, expected);
Example: Merge sets
import { deepMerge } from "@ende/collections/deep-merge";
import { assertEquals } from "@ende/assert";
const a = { foo: new Set([1]) };
const b = { foo: new Set([2]) };
const result = deepMerge(a, b);
const expected = { foo: new Set([1, 2]) };
assertEquals(result, expected);
Example: Merge with custom options
import { deepMerge } from "@ende/collections/deep-merge";
import { assertEquals } from "@ende/assert";
const a = { foo: [1, 2] };
const b = { foo: [3, 4] };
const result = deepMerge(a, b, { arrays: "replace" });
const expected = { foo: [3, 4] };
assertEquals(result, expected);
function
function deepMerge<T extends Record<PropertyKey, unknown>, U extends Record<PropertyKey, unknown>, Options extends DeepMergeOptions>(record: Readonly<T>, other: Readonly<U>, options?: Readonly<Options>): DeepMerge<T, U, Options>Merges the two given records, recursively merging any nested records with the second collection overriding the first in case of conflict.
For arrays, maps and sets, a merging strategy can be specified to either
replace values, or merge them instead.
record: Readonly<T>First record to merge.
other: Readonly<U>Second record to merge.
options?: Readonly<Options>Merging options.
Returns
A new record with the merged values.
Example: Merge objects
import { deepMerge } from "@ende/collections/deep-merge";
import { assertEquals } from "@ende/assert";
const a = { foo: true };
const b = { foo: { bar: true } };
const result = deepMerge(a, b);
const expected = { foo: { bar: true } };
assertEquals(result, expected);
Example: Merge arrays
import { deepMerge } from "@ende/collections/deep-merge";
import { assertEquals } from "@ende/assert";
const a = { foo: [1, 2] };
const b = { foo: [3, 4] };
const result = deepMerge(a, b);
const expected = { foo: [1, 2, 3, 4] };
assertEquals(result, expected);
Example: Merge maps
import { deepMerge } from "@ende/collections/deep-merge";
import { assertEquals } from "@ende/assert";
const a = { foo: new Map([["a", 1]]) };
const b = { foo: new Map([["b", 2]]) };
const result = deepMerge(a, b);
const expected = { foo: new Map([["a", 1], ["b", 2]]) };
assertEquals(result, expected);
Example: Merge sets
import { deepMerge } from "@ende/collections/deep-merge";
import { assertEquals } from "@ende/assert";
const a = { foo: new Set([1]) };
const b = { foo: new Set([2]) };
const result = deepMerge(a, b);
const expected = { foo: new Set([1, 2]) };
assertEquals(result, expected);
Example: Merge with custom options
import { deepMerge } from "@ende/collections/deep-merge";
import { assertEquals } from "@ende/assert";
const a = { foo: [1, 2] };
const b = { foo: [3, 4] };
const result = deepMerge(a, b, { arrays: "replace" });
const expected = { foo: [3, 4] };
assertEquals(result, expected);
function
function deepMerge<T extends Record<PropertyKey, unknown>, U extends Record<PropertyKey, unknown>, Options extends DeepMergeOptions = { arrays: "merge"; sets: "merge"; maps: "merge" }>(record: Readonly<T>, other: Readonly<U>, options?: Readonly<Options>): DeepMerge<T, U, Options>