# 深度默认值

使用 lodash _.defaultsDeep 应用深度默认值

> 标准页面: https://elysiatools.com/zh/tools/defaults-deep

- **分类:** Data Processing

- **关键词:** 深度默认, 对象, lodash, 嵌套, 属性

## 概述

为未定义属性递归分配默认值。

**亮点：**
- 使用 lodash `_.defaultsDeep`
- 深度应用到嵌套对象
- 只填充 undefined 属性

**示例：**
- 目标：`{"a":{"b":1}}`
- 来源 1：`{"a":{"b":2,"c":3}}`
- 结果：`{"a":{"b":1,"c":3}}`

## 输入项

- **目标对象** (textarea): 输入目标 JSON 对象
- **来源 1** (textarea): 第一个来源对象
- **来源 2** (textarea): 可选的来源对象
- **来源 3** (textarea): 可选的来源对象

## 适用场景

- 需要合并多层嵌套的配置对象，且希望保留用户自定义配置的优先级时。
- 为 API 响应或数据结构设置完整的默认值，避免访问深层属性时报错时。
- 处理用户输入或表单数据，需要与一套完整的默认设置进行深度合并时。

## 工作原理

- 输入一个“目标对象”和一个或多个“来源对象”。
- 工具内部调用 lodash 的 `_.defaultsDeep` 函数进行递归合并。
- 合并逻辑为：仅当目标对象中某个路径的值为 `undefined` 时，才会将来源对象中对应路径的值赋给它。
- 输出合并后的完整对象，目标对象的原始值始终优先。

## 使用案例

- 前端项目配置管理：合并用户自定义的主题配置与框架的默认主题配置。
- 后端 API 数据补全：为从数据库查询出的不完整数据对象，补全所有必需的字段默认值。
- 数据处理流水线：在数据处理步骤间，确保数据结构始终包含所有预期的字段，即使某些步骤未生成它们。

## 常见问题

### 这个工具是做什么的？

它递归地将多个来源对象的默认值填充到目标对象中，只填充目标对象里值为 `undefined` 的属性。

### 它和普通的对象合并（浅合并）有什么区别？

普通合并会覆盖同名属性。此工具是“深度默认”，只填充 `undefined` 的属性，能处理嵌套对象，且目标对象的值永远优先。

### 它会如何处理数组？

根据 lodash `_.defaultsDeep` 的行为，数组会被视为普通值进行合并，不会递归合并数组内的元素。

### 这个工具会修改我输入的原始对象吗？

不会。工具返回的是一个合并后的新对象，您的原始输入对象保持不变。

### 最多可以添加几个来源对象？

工具界面支持最多三个来源对象（来源1、来源2、来源3），其中来源2和来源3是可选的。

## 相关工具

- [对象继承赋值](https://elysiatools.com/zh/tools/assign-in-object): 使用 lodash _.assignIn 分配自有和继承属性
- [深度扁平化数组](https://elysiatools.com/zh/tools/flatten-deep-array): 使用 lodash _.flattenDeep 完全扁平化数组
- [遍历对象](https://elysiatools.com/zh/tools/for-in-object): 使用 lodash _.forIn 遍历对象属性
- [遍历自有属性](https://elysiatools.com/zh/tools/for-own): 使用 lodash _.forOwn 遍历对象自有属性
- [按值反转](https://elysiatools.com/zh/tools/invert-by): 使用 lodash _.invertBy 按值分组反转
- [对象反转](https://elysiatools.com/zh/tools/invert-object): 使用 lodash _.invert 反转键和值
- [继承键列表](https://elysiatools.com/zh/tools/keys-in-list): 使用 lodash _.keysIn 获取键列表
- [键列表](https://elysiatools.com/zh/tools/keys-list): 使用 lodash _.keys 获取键列表

## 示例

- [Grafana 高级应用示例](https://elysiatools.com/zh/samples/grafana-samples): 全面的 Grafana 示例，涵盖高级仪表板设计、告警配置、数据源集成和插件开发
- [二维码示例](https://elysiatools.com/zh/samples/qrcode-samples): 用于测试二维码读取和生成工具的示例二维码图像
- [D3.js 数据可视化示例](https://elysiatools.com/zh/samples/d3js-data-visualization): 全面的D3.js数据可视化示例，包括图表、地图、动画和交互式可视化
- [Rome JavaScript 工具链示例](https://elysiatools.com/zh/samples/rome): Rome JavaScript 工具链示例，包括配置、代码检查、格式化、打包和项目管理

## 相关内容

- [JSON 交换与格式翻译工具](https://elysiatools.com/zh/hubs/json-convert): 在一个专题里比较 JSON 与 CSV、YAML、TOML、GraphQL、XML、Markdown、Excel、BSON、EDN 等结构化格式之间的转换工具。
- [JSON 检查、对比与转换工具](https://elysiatools.com/zh/hubs/json-utility): 把 JSON 格式化、差异对比、路径检查、Schema 校验、合并、转换和导出工具集中到一个专题中，适合 API 与数据处理流程。
- [JSON Schema、Mock 数据与 API 夹具生成工具](https://elysiatools.com/zh/hubs/json-generate): 围绕JSON Schema 生成、Mock 负载构建与 API 夹具准备整理的一组工具。
- [JSON 格式化、对比与规范化工具](https://elysiatools.com/zh/hubs/json-format): 在一个专题中比较 JSON 格式化、差异对比、日志审查、配置比较和数据规范化工具，适合需要让 JSON 更易读、更易审查的流程。
