1.使用扩展运算符
通过将源对象展开为一个新对象,再将新对象合并到目标对象中,使用扩展运算符(...)可以实现对象合并。此方法适用于浅拷贝。
const obj1 = {a: 1, b: 2};
const obj2 = {b: 1, c: 3, d: 4};
const mergedObj = {...obj1, ...obj2};
console.log(mergedObj);
// 输出: {a: 1, b: 1, c: 3, d: 4}
2.使用Object.assign()方法
通过使用Object.assign()方法,可以将若干个源对象的属性复制到目标对象中。此方法适用于浅拷贝。
const obj1 = {a: 1, b: 2};
const obj2 = {b: 1, c: 3, d: 4};
const mergedObj = Object.assign({}, obj1, obj2);
console.log(mergedObj);
// 输出: {a: 1, b: 1, c: 3, d: 4}
3.使用自定义函数
通过自定义函数,可以将多个源对象的属性复制到目标对象中。此方法适用于深拷贝和浅拷贝。
function mergeObjects(obj1, obj2) {
const resultObj = {};
Object.keys(obj1).forEach(key => {
resultObj[key] = obj1[key];
});
Object.keys(obj2).forEach(key => {
// 当合并两个源对象时,如果存在相同属性名,则合并后的属性值将来自后面的源对象。如果需要保留两个源对象中相同属性名的属性值,则需要在自定义函数中处理。
if (obj2[key] !== null && obj2[key] !== '') {
resultObj[key] = obj2[key];
}
});
return resultObj;
}
const obj1 = { a: 1, b: 2, c: 33, d: null, e: null }
const obj2 = { c: null, d: 4, e: null }
const mergedObj = mergeObjects(obj1, obj2);
const mergedObj2 = mergeObjects(obj2, obj1)
console.log(mergedObj, '----', mergedObj2);
// 输出: {a: 1, b: 2, c: 33, d: 4, e: null}, '----', {c: 33, d: 4, e: null, a: 1, b: 2}
注意事项:
1.相同属性名的处理方式
当合并两个源对象时,如果存在相同属性名,则合并后的属性值将来自后面的源对象。如果需要保留两个源对象中相同属性名的属性值,则需要在自定义函数中处理。
2.数组的合并方式
当合并两个包含数组的源对象时,使用扩展运算符或Object.assign()方法只能完成浅拷贝。如果需要深拷贝数组,需要在自定义函数中处理。
3.属性描述符的保留
在合并对象时,有时需要保留原始属性的一些特性,例如属性描述符(如 writable、enumerable、configurable)。使用Object.assign()方法合并对象时,会将目标对象中已经存在的属性的属性描述符全部删除。在自定义函数中合并对象时,需要复制属性时同时复制属性特性。