合并 Object 的几种基本方法

在开发过程中,我们经常会遇到合并对象的需求,今天我们就来了解一下合并对象的几种基本方法。

Object.assign()

Object.assign() 方法可以将一个或多个源对象的属性复制到目标对象中。如果源对象有自己的属性,那么它们的值将被保留。

javascript 复制代码
const o1 = { a: 1, b: 1, c: 1 };
const o2 = { b: 2, c: 2 };
const o3 = { c: 3 };

const obj = Object.assign({}, o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }

Object.assign() 是浅拷贝,如果源对象中有值的引用,合并后在目标对象中修改值引用,同时会修改源对象的值引用。

javascript 复制代码
const o1 = { a: 1 };
const o2 = { b: {
    name: "b"
} };

const obj = Object.assign({}, o1, o2);
obj.b.name = "new_b";
console.log(o2.b); // {name: 'new_b'}

解构赋值

使用解构赋值可以将对象的属性复制到一个新的对象中。

javascript 复制代码
const o1 = { a: 1, b: 1, c: 1 };
const o2 = { b: 2, c: 2 };
const obj = { ...o1, ...o2 };
console.log(obj); // {a: 1, b: 2, c: 2}

可以看出,使用结构赋值合并对象时,后面对象的属性值会覆盖前面已有属性值。

使用递归方法

我们可以通过递归的方法将对象中的嵌套对象合并到一个新的对象中。

javascript 复制代码
/** @format */

function mergeObjects(obj1, obj2) {
    const mergedObj = Object.assign({}, obj1, obj2);

    // 递归处理嵌套对象
    Object.keys(mergedObj).forEach((key) => {
        if (typeof mergedObj[key] === "object" && obj1[key] && obj2[key]) {
            mergedObj[key] = mergeObjects(obj1[key], obj2[key]);
        }
    });

    return mergedObj;
}

const obj1 = { a: 1, b: { c: 2, d: 3, e: { name: "e" } } };
const obj2 = { a: 2, b: { c: 3, d: 4, e: { age: 18 } } };
const mergedObj = mergeObjects(obj1, obj2);
console.log(mergedObj);
// {a:2,b:{c:3,d:4,e:{name:e,age:18}}}

总结

以上介绍的是合并对象的三种基本操作,它们也只是简化了合并对象的步骤,在具体使用的时候,需要根据场景判断哪种最合适。

相关推荐
给个offer养家糊口6 小时前
抽离 elpis npm 包
前端
默_笙6 小时前
🙃 我让爬虫终于看到了我的网站,后端同事说"这也行?"(下):App Router 全栈实战
前端·javascript
九九落6 小时前
JavaScript 实现北京时间精确到毫秒显示:UTC+8、Asia/Shanghai 与在线时间校准详解
开发语言·javascript·ecmascript
葡萄城技术团队6 小时前
一个单元格放置两个日期选择器:用 SpreadJS CellButtons 录入日期范围
前端
FEF前端团队7 小时前
小程序微信支付 V3 接入实战手册:从商户配置到前后端落地
javascript·后端·node.js
马可家的菠萝7 小时前
自动保存已经有了,为什么笔记软件还需要“历史版本”?
前端·后端·架构
半个落月7 小时前
从 "use client" 到 Route Handler:用 Todos 理解 Next.js 水合与全栈请求
前端·react.js·next.js
qq_452396237 小时前
第七篇:《大型前端项目的模块化与目录结构设计》
前端
你脑门上的脚印8 小时前
Vue 项目从零实现语音转文字、文字转语音功能(完整可用 + 踩坑指南)
前端·vue.js
paopaokaka_luck8 小时前
基于springboot3+vue3的车间生产管理系统(Echarts图形化分析、BI报表)
java·前端·spring boot·学习·echarts