[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));

 

posted @   Zhentiw  阅读(418)  评论(0编辑  收藏  举报
编辑推荐:
· 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
点击右上角即可分享
微信分享提示