--- comments: true difficulty: 中等 edit_url: https://github.com/doocs/leetcode/edit/main/solution/2700-2799/2755.Deep%20Merge%20of%20Two%20Objects/README.md tags: - JavaScript --- <!-- problem:start --> # [2755. 深度合并两个对象 🔒](https://leetcode.cn/problems/deep-merge-of-two-objects) [English Version](/solution/2700-2799/2755.Deep%20Merge%20of%20Two%20Objects/README_EN.md) ## 题目描述 <!-- description:start --> <p>给定两个值 <code>obj1</code> 和 <code>obj2</code>,返回一个 <strong>深度合并</strong> 的值。</p> <p>你应该遵循以下规则进行值的 <strong>深度合并</strong>:</p> <ul> <li>如果两个值都是对象,则结果对象应包含两个对象上存在的所有键。</li> <li>如果一个键同时存在于两个对象中,则 <strong>深度合并</strong> 两个关联的值。否则,将键值对添加到结果对象中。</li> <li>如果两个值都是数组,则结果数组的长度应与较长的数组相同。对于对象的合并逻辑,将索引视为键。</li> <li>否则,结果值为 <code>obj2</code>。</li> </ul> <p>你可以假设 <code>obj1</code> 和 <code>obj2</code> 是 <code>JSON.parse()</code> 的输出结果。</p> <p> </p> <p><strong class="example">示例 1:</strong></p> <pre> <b>输入:</b>obj1 = {"a": 1, "c": 3}, obj2 = {"a": 2, "b": 2} <b>输出:</b>{"a": 2, "c": 3, "b": 2} <b>解释:</b><code>obj1["a"]</code> 的值变为 2,因为如果两个对象具有相同的键且它们的值不是数组或对象,则将 <code>obj1</code> 的值更改为 <code>obj2</code> 的值。键 "b" 和其值被添加到 <code>obj1</code> 中,因为它在 <code>obj1</code> 中不存在。 </pre> <p><strong class="example">示例 2:</strong></p> <pre> <b>输入:</b>obj1 = [{}, 2, 3], obj2 = [[], 5] <b>输出:</b>[[], 5, 3] <b>解释:</b><code>result[0] = obj2[0]</code>,因为 <code>obj1[0]</code> 和 <code>obj2[0]</code> 类型不同。<code>result[2] = obj1[2]</code>,因为 <code>obj2[2]</code> 不存在。 </pre> <p><strong class="example">示例 3:</strong></p> <pre> <b>输入:</b> obj1 = {"a": 1, "b": {"c": [1 , [2, 7], 5], "d": 2}}, obj2 = {"a": 1, "b": {"c": [6, [6], [9]], "e": 3}} <b>输出:</b>{"a": 1, "b": {"c": [6, [6, 7], [9]], "d": 2, "e": 3}} <b>解释:</b> 数组 <code>obj1["b"]["c"]</code> 和 <code>obj2["b"]["c"]</code> 已合并,如果 <code>obj2</code> 的值不是数组或对象,则深度覆盖 <code>obj1</code> 的值。 <code>obj2["b"]["c"]</code> 有键 "e",而 <code>obj1</code> 中没有,所以将其添加到 <code>obj1</code> 中。 </pre> <p><strong class="example">示例 4:</strong></p> <pre> <b>输入:</b>obj1 = true, obj2 = null <b>输出:</b>null </pre> <p> </p> <p><strong>解释:</strong></p> <ul> <li><code>obj1</code> 和 <code>obj2</code> 都是有效的 JSON 值</li> <li><code>1 <= JSON.stringify(obj1).length <= 5 * 10<sup>5</sup></code></li> <li><code>1 <= JSON.stringify(obj2).length <= 5 * 10<sup>5</sup></code></li> </ul> <!-- description:end --> ## 解法 <!-- solution:start --> ### 方法一 <!-- tabs:start --> #### TypeScript ```ts function deepMerge(obj1: any, obj2: any): any { const isObj = (obj: any) => obj && typeof obj === 'object'; const isArr = (obj: any) => Array.isArray(obj); if (!isObj(obj1) || !isObj(obj2)) { return obj2; } if (isArr(obj1) !== isArr(obj2)) { return obj2; } for (const key in obj2) { obj1[key] = deepMerge(obj1[key], obj2[key]); } return obj1; } /** * let obj1 = {"a": 1, "c": 3}, obj2 = {"a": 2, "b": 2}; * deepMerge(obj1, obj2); // {"a": 2, "c": 3, "b": 2} */ ``` <!-- tabs:end --> <!-- solution:end --> <!-- problem:end -->