let def = {
"l1": 'abc',
// "l2": [1, 2, 3],
"l3": {
l3_a: false,
l3_b: ['1', 123]
},
"l4": true,
"l6": [
{
l6_a: true,
l6_b: [1, 2, 3],
}
],
}
let b = {
// "l1": 'abc',
// "l2": [1, 2, 3],
"l3": {
l3_a: false,
l3_b: ['1', 123]
},
"l4": true,
"l6": [
{
l6_a: true,
l6_b: [1, 2, 3],
}
],
}
const isEmpty = (str) => {
if (!str) {
return true;
} else if (typeof str === 'object' && Object.keys(str).length === 0) {
return true;
} else if (typeof str === 'string' && str.replace(/(^\s*)|(\s*$)/g, '').length === 0) {
return true;
}
return false;
};
const compArray = (array1, array2) => {
if ((array1 && typeof array1 === 'object' && array1.constructor === Array) &&
(array2 && typeof array2 === 'object' && array2.constructor === Array)) {
if (array1.length == array2.length) {
let flag = true;
for (let i = 0; i < array1.length; i++) {
if (typeof array1[i] === 'string' && typeof array2[i] === 'string') {
flag = array1[i] === array2[i]
} else if (typeof array1[i] === 'number' && typeof array2[i] === 'number') {
flag = array1[i] === array2[i]
} else if (typeof array1[i] === 'boolean' && typeof array2[i] === 'boolean') {
flag = array1[i] === array2[i]
} else if (typeof array1[i] === 'object' && typeof array2[i] === 'object') {
flag = isEmpty(compObj(array1[i], array2[i]))
}
}
return flag;
} else {
return false;
}
} else {
throw new Error('argunment is error ;');
}
return true;
};
//比较两个对象是否相等,不包含原形上的属性计较
const compObj = (obj1, obj2) => {
if ((obj1 && typeof obj1 === 'object') && ((obj2 && typeof obj2 === 'object'))) {
for (let ob in obj1) {
try {
// if ((obj1[ob] && !obj2[ob]) || (!obj1[ob] && obj2[ob])) {
// // delete obj1[ob];
// delete obj2[ob];
// return obj2;
// }
if (obj1.hasOwnProperty(ob) && obj2.hasOwnProperty(ob)) {
//如果属性是数组
if (obj1[ob].constructor == Array && obj2[ob].constructor == Array) {
let abc = compArray(obj1[ob], obj2[ob])
// console.log('----', abc, obj1[ob], obj2[ob])
if (abc) {
delete obj2[ob];
}
} else if (typeof obj1[ob] === 'string' && typeof obj2[ob] === 'string') {
//纯属性
if (obj1[ob] === obj2[ob]) {
// delete obj1[ob];
delete obj2[ob];
// return false;
}
} else if (typeof obj1[ob] === 'number' && typeof obj2[ob] === 'number') {
//纯数字
if (obj1[ob] === obj2[ob]) {
// delete obj1[ob];
delete obj2[ob];
// return false;
}
} else if (typeof obj1[ob] === 'boolean' && typeof obj2[ob] === 'boolean') {
// console.log('boolean----')
//布尔值
if (obj1[ob] === obj2[ob]) {
// delete obj1[ob];
delete obj2[ob];
// return false;
}
} else if (typeof obj1[ob] === 'object' && typeof obj2[ob] === 'object') {
//属性是对象
// console.log('对象---', obj1[ob], obj2[ob])
if (isEmpty(compObj(obj1[ob], obj2[ob]))) {
delete obj2[ob];
}
} else {
if (obj1[ob] === obj2[ob]) {
// delete obj1[ob];
delete obj2[ob];
console.log('else-1--');
// return false;
}
}
} else {
if (obj1[ob] === obj2[ob]) {
// delete obj1[ob];
delete obj2[ob];
console.log('else-2--');
// return false;
}
}
} catch (e) {
// console.log({ob,obj1,obj2})
}
}
}
return obj2;
};
console.log(JSON.stringify(compObj(def, b)))