使用Lodash mergeWith自定义合并器未获预期输出的问题
解决Lodash合并时单对象独有的required数组置空问题
现有需求:合并两个模板对象时,required数组在两个对象都存在时取交集,仅在单个对象中存在时置为空数组,其他键值对保留差异。原代码仅实现了交集逻辑,未处理单对象存在required的场景,需要调整自定义合并器。
修改后的完整代码
function customizer(objValue, srcValue, key) { if (key === 'required') { // 两个对象都有required数组,取交集 if (_.isArray(objValue) && _.isArray(srcValue)) { return _.intersection(objValue, srcValue); } // 仅单个对象有required(或其中一个不是数组),返回空数组 return []; } // 非required字段,交给Lodash默认逻辑合并 } var a = { 'a': { 'required': [1,2,3] }, 'b': { 'required': [1,3] }, 'c': { 'd': { 'e': { 'f': { 'required': [4,5] } } } } } var b = { 'a': { 'required': [1,2] }, 'b': { 'required': [1,2,3] } } let c = {} console.log(_.mergeWith(c, a, b, customizer));
运行结果(符合期望)
{ 'a': { 'required': [1,2] }, 'b': { 'required': [1,3] }, c: { d: { e: { f: { 'required': [] } } } } }
逻辑说明
- 当处理
required键时,优先判断两个值是否都是数组:是则返回交集结果 - 只要其中一个值不存在、或不是数组,直接返回空数组
- 非
required的键,返回undefined让Lodash沿用默认合并逻辑,保留差异键值对
内容的提问来源于stack exchange,提问作者fidato
相关产品推荐
相关产品推荐

