找到新对象与默认对象的差别。优化接口。

在工作中我们经常会操作某个对象,如果对象很大,但是每次只更改一小部分。没必要把个对象都传给后端。采取值传递修改的数据。如果不修改,传空对象。在获取的时候,可通过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
    }
  }

posted on 2021-01-06 16:13  冰love  阅读(115)  评论(0编辑  收藏  举报

导航