Skip to content

Instantly share code, notes, and snippets.

@rfprod
Last active January 28, 2020 11:25
Show Gist options
  • Save rfprod/d893d8c62e5d71870cae50bbc2c6e7f7 to your computer and use it in GitHub Desktop.
Save rfprod/d893d8c62e5d71870cae50bbc2c6e7f7 to your computer and use it in GitHub Desktop.
Deep Objects Compare
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

Deep Objects Compare

Function deepObjectsCompare compares two objects provided as the function arguments.

Arguments can be of the following types: null, undefined, string, number, object, array.

Arguments may have nested objects. Arguments examples:

  • deepObjectsCompare(1, 1)
  • deepObjectsCompare([1, 2], [1, 2]);
  • deepObjectsCompare({ one: 'two' }, {one: 'two' });
  • deepObjectsCompare([1, { one: 'two' }], [1, {one: 'two' }]);

A script by V.

License.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment