|
function deepObjectsCompare(o1, o2) { |
|
if (!o1 || !o2) { |
|
if ((o1 === null && o2 !== null) || (o1 !== null && o2 === null)) { |
|
return false; // return false if one arg is null while another is undefined |
|
} |
|
return true; // return true if both args are null or undefined |
|
} |
|
//console.log(o1, o2); |
|
let keys1 = 0; |
|
for (let key in o1) { keys1++; } |
|
//console.log('keys1:', keys1); |
|
let keys2 = 0; |
|
for (let key in o2) { keys2++; } |
|
//console.log('keys2:', keys2); |
|
if (keys1 > 0 && keys2 > 0) { |
|
if (keys1 !== keys2) { |
|
return false; // return false if o1 and o2 keys count does not match |
|
} |
|
for (let key in o1) { |
|
if (o1[key] && o2[key]) { |
|
let nestedKeys1 = 0; |
|
for (let nestedKey in o1[key]) { nestedKeys1++; } |
|
//console.log('nested keys1:', nestedKeys1); |
|
let nestedKeys2 = 0; |
|
for (let nestedKey in o2[key]) { nestedKeys2++; } |
|
//console.log('nested keys2:', nestedKeys2); |
|
if (nestedKeys1 > 0 & nestedKeys2 > 0 && !o1.substring) { |
|
//console.log('nested object compare'); |
|
const nestedCompareRes = deepObjectsCompare(o1[key], o2[key]); |
|
//console.log('nestedCompareRes:', nestedCompareRes); |
|
if (!nestedCompareRes) { return false; } |
|
} else if (o1[key] !== o2[key]) { |
|
//console.log('simple values, one is number:', o1[key], '|', o2[key]); |
|
return false; // return false if o1[key] and o2[key] are simple values and not equal each other |
|
} |
|
} |
|
} |
|
} else if (o1 !== o2) { |
|
//console.log('simple values, one is number:', o1, '|', o2); |
|
return false; // return false if o1 and o2 are simple values and not equal each other |
|
} |
|
return true; |
|
}; |
|
|
|
// TEST |
|
deepObjectsCompare(null, null); // true |
|
deepObjectsCompare(null, undefined); // false |
|
deepObjectsCompare(undefined, undefined); // true |
|
deepObjectsCompare(1, 2); // false |
|
deepObjectsCompare(1, 1); // true |
|
deepObjectsCompare([1, 2], [1, 2]); // true |
|
deepObjectsCompare([1, 2], [1, 1]); // false |
|
deepObjectsCompare({ one: 'two' }, {one: 'two' }); // true |
|
deepObjectsCompare({ one: 'two' }, {one: 'three' }); // false |
|
deepObjectsCompare([1, { one: 'two' }], [1, {one: 'two' }]); // true |
|
deepObjectsCompare([1, { one: 'two' }], [{one: 'three' }, 1]); // false |