废话不多说,直接上干货。
let utils = {
/**
* 比较两个json(新json与老json)的不同,并返回 不同时的旧值(old_val)和新值(new_val)
* @param {*} json1 老json
* @param {*} json2 新json
*/
diff(json1, json2) {
if (!json1 || this.isEmptyObject(json1) || !json2 || this.isEmptyObject(json2)) {
return null;
}
let diffRes = {
old_val: {},
new_val: {}
};
for (let k in json2) {
// 判断数据类型是否一致
if (this.getTypeByObj(json2[k]) === this.getTypeByObj(json1[k])) {
// 比较 “Array”和“Object”类型
if (this.getTypeByObj(json2[k]) === 'Array' || this.getTypeByObj(json2[k]) === 'Object') {
const diffData = this.diff(json1[k], json2[k]);
if (!this.isEmptyObject(diffData)) {
diffRes.old_val[k] = diffData.old_val;
diffRes.new_val[k] = diffData.new_val;
}
} else if (json1[k] !== json2[k]) { // 比较其他类型数据
diffRes.old_val[k] = json1[k];
diffRes.new_val[k] = json2[k];
}
} else {
diffRes.old_val[k] = json1[k];
diffRes.new_val[k] = json2[k];
}
}
// 若没有变化,返回null
if (this.isEmptyObject(diffRes.old_val) || this.isEmptyObject(diffRes.new_val)) {
return null;
}
return diffRes;
},
/**
* 获取数据类型
* @param {*} obj
*/
getTypeByObj(obj) {
return Object.prototype.toString.call(obj).match(/^\[object ([a-zA-Z]*)\]$/)[1];
},
/**
* 判断是否是空对象
* @param {*} obj
*/
isEmptyObject(obj) {
for (var key in obj) {
return false;
};
return true;
}
}
let obj1 = {
name: 'jack',
age: 18,
title: '这是标题',
lv2: {
tip: '这是二层提示',
lv3: {
noC: 'noC',
msg: "这是三层msg"
}
}
}
let obj2 = {
name: 'jack',
age: 188,
title: '这是标题1',
lv2: {
tip: '这是二层提示',
lv3: {
noC: 'noC',
msg: "这是三层msg1"
}
},
no: '这是obj1没有的'
}
console.log(utils.diff(obj1, obj2));
/**
{
"old_val": {
"age": 18,
"title": "这是标题",
"lv2": {
"lv3": {
"msg": "这是三层msg"
}
}
},
"new_val": {
"age": 188,
"title":
"这是标题1",
"lv2":
{
"lv3":
{ "msg": "这是三层msg1" }
},
"no": "这是obj1没有的"
}
}
*/