如何进一步精简基于路径合并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
相关产品推荐
相关产品推荐

