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 | U

Merge deeply two objects

Source

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>): T

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: 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>

Source