ITADN
RebeccaStevens/deepmerge-ts
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

DeepmergeTS

npm version jsr Version CI Coverage Status
code style: prettier GitHub Discussions BSD 3 Clause license Commitizen friendly semantic-release

深度合并 2 个或更多对象,同时尊重类型信息。

smart merge diagram

捐赠

任何捐赠都将不胜感激。 😄

企业用户

deepmerge-ts 作为 Tidelift 订阅的一部分提供。

Tidelift 正与 deepmerge-ts 的维护者以及不断壮大的开源维护者网络合作,以确保 您的开源软件供应链现在及未来都符合企业标准。 了解更多。

安装

npm

# Install with npm
npm install deepmerge-ts

# Install with pnpm
pnpm add deepmerge-ts

# Install with yarn
yarn add deepmerge-ts

# Install with bun
bun add deepmerge-ts

jsr

# Install in a node project
npx jsr add @rebeccastevens/deepmerge

# Install in a deno project
deno add jsr:@rebeccastevens/deepmerge

# Install in a bun project
bunx jsr add @rebeccastevens/deepmerge

特性

  • 智能合并 - 高性能。
  • 合并后的输出具有正确的类型。
  • 支持 Record 合并。
  • 支持 Array 合并。
  • 支持 Map 和 Set 合并。
  • 支持自定义合并。

用法

使用默认配置的示例

import { deepmerge } from "deepmerge-ts";

const x = {
  record: {
    prop1: "value1",
    prop2: "value2",
  },
  array: [1, 2, 3],
  set: new Set([1, 2, 3]),
  map: new Map([
    ["key1", "value1"],
    ["key2", "value2"],
  ]),
};

const y = {
  record: {
    prop1: "changed",
    prop3: "value3",
  },
  array: [2, 3, 4],
  set: new Set([2, 3, 4]),
  map: new Map([
    ["key2", "changed"],
    ["key3", "value3"],
  ]),
};

const z = {
  record: {
    prop1: undefined,
    prop3: undefined,
    prop2: undefined,
    prop4: undefined,
  },
  array: undefined,
  set: undefined,
  map: undefined,
};

const merged = deepmerge(x, y, z);

console.log(merged);

// Prettierfied output:
//
// Object {
//   "record": Object {
//     "prop1": "changed",
//     "prop2": "value2",
//     "prop3": "value3",
//     "prop4": undefined,
//   },
//   "array": Array [1, 2, 3, 2, 3, 4],
//   "set": Set { 1, 2, 3, 4 },
//   "map": Map {
//     "key1" => "value1",
//     "key2" => "changed",
//     "key3" => "value3",
//   },
// }

你可以在 codesandbox.io 上尝试此示例。

合并到目标对象

如果你想使用合并结果更新目标对象,而不是创建一个新的 对象,可以使用 deepmergeInto

此函数最适合用于所有类型相同的对象。

注意:如果目标对象的类型与输入对象不同,我们将断言目标的类型已更改 (使用 deepmergeIntoCustom 时不会自动执行此操作)。

自定义合并过程

我们为每个主要的 deepmerge 函数提供了自定义函数:deepmergeCustomdeepmergeIntoCustom。 你可以使用这些函数来自定义值应如何合并的细节。

有关更多详细信息,请参阅 deepmerge 自定义文档

性能

我们使用智能合并,而不是某些替代库使用的经典合并策略。这极大地提高了 性能,包括执行时间和内存使用率。

经典合并(我们不是这样做的)

在经典合并中,每个输入与下一个输入合并,直到所有输入都合并完毕。

当需要合并大量项目时,此策略存在严重的性能问题。

classic merge animation

智能合并(我们的做法)

通过我们的智能合并,我们向前查看哪些内容可以被合并,并且只合并这些内容。

除了性能提升之外,该策略还一次性合并多个输入;从而带来诸如 对输入取平均值等好处。

smart merge animation

API

参见 API 文档.