首页 > 解决方案 > 深度合并,但前提是 js 中的值不为空

问题描述

我正在使用 lodash mergeWith 并且所有功能都适用于以下函数,但是一旦我添加了深层嵌套对象,那么定制器就不会考虑深层嵌套对象。

const merge = (main, base) => {
  return mergeWith(main, base, (a, b) => {
    return b === "" ? a : b;
  });
};

这行得通

const main = {
 name: 'tim'
 age: '24'
}

const base = {
  name: ''
  age: '20'
}

const merged = merge(main,base);
// {name: tim, age: 20}

这不能按预期工作

const main = {
 name: 'tim'
 age: '24'
 data: { height: '11', width: '10' } 
}

const base = {
  name: ''
  age: '20'
  data: { height: '21', width: '' } 
}

const merged = merge(main,base);
// {name: tim, age: 20, data: { height: '21', width: '' } }

即使它是空的,它的合并宽度也是如此。应该是 // {name: tim, age: 20, data: { height: '21', width: '10' } }

标签: javascriptlodash

解决方案


undefined如果需要遍历对象,则需要返回。所以你的mergeWith比较应该是:

const merged = _.mergeWith(main,base,(a,b) => {
  if (typeof b === 'object') return;
    return b === "" ? a : b;
});

JSFiddle


推荐阅读