js合并对象

本文介绍了JavaScript中使用扩展运算符、Object.assign()方法和自定义函数进行对象合并的过程,以及它们在浅拷贝和深拷贝中的应用。特别关注了如何处理相同属性名、数组合并以及保留属性描述符的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()方法合并对象时,会将目标对象中已经存在的属性的属性描述符全部删除。在自定义函数中合并对象时,需要复制属性时同时复制属性特性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值