You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何进一步精简基于路径合并JavaScript对象的Lodash实现

嘿,我来帮你精简这个mergePath方法!你的实现已经能用,但确实可以借助Lodash的工具函数让它更简洁优雅。

首先先回顾下你的原实现:

let obj1 = { z: {fields: { a: "200", b: "2" }}} 
let obj2 = { z: {fields: { a: "2", b: "20" }}} 
let objsPath = "z.fields" 
let mergePath = (objsPath, obj1, obj2) => ( 
  _.set(obj1, objsPath, {..._.get(obj1, objsPath), ..._.get(obj2, objsPath)}) 
)

精简方案1:用_.update减少重复操作

Lodash的_.update方法可以直接对指定路径的值进行修改,省去了手动_.get再_.set的重复步骤,代码更紧凑:

const mergePath = (path, obj1, obj2) => 
  _.update(obj1, path, currentVal => ({ ...currentVal, ..._.get(obj2, path) }));

这个版本里,_.update会自动帮我们获取obj1中path对应的currentVal,我们只需要把它和obj2对应路径的值合并后返回,_.update会自动把合并后的值写回原路径。

更极致的精简(可选)

如果追求最短代码,可以缩短变量名(但可读性会略降,适合个人项目或明确上下文的场景):

const mergePath = (p, o1, o2) => _.update(o1, p, v => ({ ...v, ..._.get(o2, p) }));

额外提示:保持纯函数(避免修改原对象)

你的原方法会直接修改obj1本身,如果希望方法是纯函数(不改变输入对象),可以先克隆obj1再操作:

const mergePath = (path, obj1, obj2) => 
  _.update(_.cloneDeep(obj1), path, currentVal => ({ ...currentVal, ..._.get(obj2, path) }));

这样既精简了代码,又保留了核心功能,还能根据需求选择是否保持纯函数特性~

内容的提问来源于stack exchange,提问作者lgants

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:15:43