[Javascript] Deep merge in Javascript with Ramda.js mergeDeepWith
Javascript's Object.assign is shadow merge, loadsh's _.merge is deep merge, but has probem for array.
const person = { name: { first: "Joe" }, age: 23, color: "green", pets: ["dog", "lizard"] }; const update = { name: { last: "Smith" }, color: "blue", book: "Harry Potter", pets: ["cat"] };
const merged1 = { ...person, ...update, name: { ...person.name, ...update.name }, pets: [...person.pets, ...update.pets] }; /*Object {name: Object, age: 23, color: "blue", pets: Array[3], book: "Harry Potter"} name: Object age: 23 color: "blue" pets: Array[3] 0: "dog" 1: "lizard" 2: "cat" book: "Harry Potter" */ const merged2 = _.merge({}, person, update); /* name: Object first: "Joe" last: "Smith" age: 23 color: "blue" pets: Array[2] 0: "cat" 1: "lizard" book: "Harry Potter" */
We can use Ramda.js to easy solve the problem:
console.log(R.mergeDeepWith(R.concat, person, update)); /* Object {name: Object, age: 23, color: "blue", pets: Array[2], book: "Harry Potter"} name: Object first: "Joe" last: "Smith" age: 23 color: "blue" pets: Array[2] 0: "cat" 1: "lizard" book: "Harry Potter" */
To make it more point-free style and more reuseable, we can do:
const _merge = R.mergeDeepWith(R.concat); console.log(_merge(person, update));
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2017-01-18 [Angular] Using ngOnChanges lifeCycle hook to break object reference
2017-01-18 [React] Public Class Fields with React Components
2017-01-18 [RxJS] Use groupBy in real RxJS applications
2017-01-18 [Ramda] Curry and Uncurry Functions with Ramda
2015-01-18 [AngularJS] New in Angular 1.3 - $httpProvider.useApplyAsync