在工作中我们经常会操作某个对象,如果对象很大,但是每次只更改一小部分。没必要把个对象都传给后端。采取值传递修改的数据。如果不修改,传空对象。在获取的时候,可通过lodash的merge 函数,进行对象合并。

1

function findDiffFn(newObj, stardardObj) {
  let isArray = Array.isArray(newObj)
  const diff =isArray?[]: {}
  let deepDiff
  for (const key in newObj) {
    if (typeof newObj[key] === 'object' && typeof stardardObj[key] === 'object' && newObj[key] && stardardObj[key]) {
      deepDiff = findDiffFn(newObj[key], stardardObj[key])
      if (deepDiff && Object.keys(deepDiff).length > 0) {
        diff[key] = deepDiff
      }
    } else if (newObj[key] !== stardardObj[key]) {
      diff[key] = newObj[key]
    }
  }
  return diff
}

//测试用例

const newObj = {
  a:123,
  c:{
    a:23
  }
}
const stardard = {
  a:123,
}
const diff = findDiffFn(newObj, stardard)
 
//结果{"c":{"a":23}}
 
 
 
 
2:对象对比,返回属性访问路径,和值
  const tmp = []
const obj = {}
  function findDiffFn(modifyObj, defaultObj, tmp, obj) {
    if (!modifyObj || typeof (modifyObj) !== 'object') return modifyObj
    if (!defaultObj || typeof (defaultObj) !== 'object') return modifyObj
    let isArray = Array.isArray(modifyObj)
    const diff = isArray ? [] : {}
    for (const key in modifyObj) {
      tmp.push(key)
      if (modifyObj[key] && defaultObj[key]) {
        findDiffFn(modifyObj[key], defaultObj[key], tmp, obj)
        if (modifyObj[key] !== defaultObj[key]) {
          diff[key] = modifyObj[key]
          const path = tmp.join('.').replace(/(\.\d)\.?/g, (str, a) => `[${a.substr(1)}]${str.length>>2? '.':''}`)
          obj[path] = modifyObj[key]
        }
        tmp.pop()
      }
      return obj
    }
  }

相关文章:

  • 2021-09-20
  • 2022-02-04
  • 2022-12-23
  • 2022-01-14
  • 2021-10-28
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-09-15
  • 2021-07-13
  • 2021-09-15
  • 2022-12-23
  • 2021-11-26
相关资源
相似解决方案