JS 深度合并对象

18 min read
let a = {
	name: 'aaa', 
	line: {
		show: false, 
		color: 'red'
		}
	};
let b = {
	id: 2, 
	line: {
		show: true, 
		name: 'bbb'
		}
	};
function $deepObjectMerge(firstObject, secondObject) {
  for (var key in secondObject) {
    firstObject[key] = firstObject[key] && Object.prototype.toString.call(firstObject[key]) === "[object Object]" ?
    $deepObjectMerge(firstObject[key], secondObject[key]) : secondObject[key];
  }
  return firstObject;
};
console.log(a, b, $deepObjectMerge(a, b));

结果如下

{
    "name": "aaa",
    "line": {
        "show": true,
        "color": "red",
        "name": "bbb"
    },
    "id": 2
}

TS版本

type Obj =  Record<string | number | symbol, any>
export function deepObjectMerge(firstObject:Obj, secondObject:Obj) {
    for (let key in secondObject) {
        firstObject[key] = firstObject[key] && Object.prototype.toString.call(firstObject[key]) === "[object Object]" ?
            deepObjectMerge(firstObject[key], secondObject[key]) : secondObject[key];
    }
    return firstObject;
}