Skip to content

Latest commit

 

History

History

2755.Deep Merge of Two Objects

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

English Version

题目描述

给定两个值 obj1obj2,返回一个 深度合并 的值。

你应该遵循以下规则进行值的 深度合并

  • 如果两个值都是对象,则结果对象应包含两个对象上存在的所有键。
  • 如果一个键同时存在于两个对象中,则 深度合并 两个关联的值。否则,将键值对添加到结果对象中。
  • 如果两个值都是数组,则结果数组的长度应与较长的数组相同。对于对象的合并逻辑,将索引视为键。
  • 否则,结果值为 obj2

你可以假设 obj1obj2JSON.parse() 的输出结果。

 

示例 1:

输入:obj1 = {"a": 1, "c": 3}, obj2 = {"a": 2, "b": 2}
输出:{"a": 2, "c": 3, "b": 2}
解释:obj1["a"] 的值变为 2,因为如果两个对象具有相同的键且它们的值不是数组或对象,则将 obj1 的值更改为 obj2 的值。键 "b" 和其值被添加到 obj1 中,因为它在 obj1 中不存在。 

示例 2:

输入:obj1 = [{}, 2, 3], obj2 = [[], 5]
输出:[[], 5, 3]
解释:result[0] = obj2[0],因为 obj1[0]obj2[0] 类型不同。result[2] = obj1[2],因为 obj2[2] 不存在。

示例 3:

输入:
obj1 = {"a": 1, "b": {"c": [1 , [2, 7], 5], "d": 2}}, 
obj2 = {"a": 1, "b": {"c": [6, [6], [9]], "e": 3}}
输出:{"a": 1, "b": {"c": [6, [6, 7], [9]], "d": 2, "e": 3}}
解释:
数组 obj1["b"]["c"]obj2["b"]["c"] 已合并,如果 obj2 的值不是数组或对象,则深度覆盖 obj1 的值。 obj2["b"]["c"] 有键 "e",而 obj1 中没有,所以将其添加到 obj1 中。

示例 4:

输入:obj1 = true, obj2 = null
输出:null

 

解释:

  • 1 <= JSON.stringify(obj1).length <= 5 * 105
  • 1 <= JSON.stringify(obj2).length <= 5 * 105

解法

TypeScript

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}
 */