如何使用Lodash实现两个对象的选择性合并、更新与忽略操作
解决方案
Lodash没有开箱即用的专属函数可以直接匹配你的需求,但可以使用_.mergeWith搭配自定义规则配置实现,完全满足你不硬编码逻辑、灵活扩展的要求。
实现思路
将不同属性的合并策略抽为独立配置对象,后续新增属性仅需更新配置,无需修改合并核心逻辑:
- 配置中指定需要忽略更新、数组取并集的特殊属性
- 未在配置中声明的属性默认走覆盖逻辑,和
_.assign行为一致
代码示例
// 你的原始对象 var server = { 'title': 'string', 'systems': [3,4,5], 'views': 1000, 'authors': ['fred','bill'] }; var update = { 'title': 'new string', 'systems': [5], 'views': 900, 'authors': ['fred','jim'] }; // 合并策略配置,后续新增属性仅需修改此处 const mergeRules = { views: 'ignore', // 忽略该属性的更新 authors: 'union' // 该属性数组取并集 } // 传给_.mergeWith的自定义合并函数 function mergeCustomizer(objValue, srcValue, key) { const currentRule = mergeRules[key] if (currentRule === 'ignore') { return objValue // 忽略更新返回原值 } if (currentRule === 'union') { return _.union(objValue, srcValue) // 数组取并集 } // 无匹配规则时返回undefined,_.mergeWith会走默认覆盖逻辑 } // 执行合并 const result = _.mergeWith({}, server, update, mergeCustomizer)
执行后得到的result和你预期的输出完全一致:
{ title: 'new string', systems: [5], views: 1000, authors: ['fred','bill','jim'] }
扩展说明
如果后续需要新增其他合并策略(比如数值累加、数组合并去重外的其他处理),仅需在mergeRules中新增规则标识,同时在mergeCustomizer中补充对应逻辑即可,无需调整现有业务代码。
内容的提问来源于stack exchange,提问作者Erics
相关产品推荐
相关产品推荐

