import lodash from "lodash"; const defConfig = {a:{aa:1,bb:2},b:{c:2},d:[1,2,3],e:{ee:1,aa:2}} const newConfig = {a:{aa:1,bb:2},d:[5],e:{bb:2,ee:2,aa:2}} const result = { d: [ 5 ],e:{ee:2} } const load = {a:1,d:[5,1,2,3]} const DELETE = '____DELETE____' // lodash.mergeWith(defConfig,newConfig, (objValue, srcValue, key, object, source, stack) => { // console.log('stack', stack,'key',key) // // if (lodash.isArray(srcValue)) { // return srcValue // } // if(lodash.isEqual(objValue,srcValue)){ // //如何删除 // return DELETE // } // }) function doMerge (defObj, newObj) { const defObj2 = { ...defObj } const newObj2 = {} lodash.forEach(newObj,(newValue,key)=>{ // const newValue = newObj[key] const defValue = defObj[key] if (lodash.isEqual(newValue, defValue)) { delete defObj2[key] return } if (lodash.isArray(newValue)) { delete defObj2[key] newObj2[key] = newValue return } if (lodash.isObject(newValue)) { newObj2[key] = doMerge(defValue, newValue) delete defObj2[key] } else { // 基础类型,直接覆盖 delete defObj2[key] newObj2[key] = newValue } }) // defObj 里面剩下的是被删掉的 lodash.forEach(defObj2, (defValue, key) => { newObj2[key] = null }) return newObj2 } console.log(doMerge(defConfig,newConfig))