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