Created
May 10, 2022 20:22
-
-
Save brandonbarringer/d0dd9c6ce89526550e0f7cc85a26ed69 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const objectDiff = (obj1, obj2) => { | |
// Make sure an object to compare is provided | |
if (!obj2 || Object.prototype.toString.call(obj2) !== '[object Object]') { | |
return obj1; | |
} | |
let diffs = {}; | |
let key; | |
/** | |
* Check if two arrays are equal | |
* @param {Array} arr1 The first array | |
* @param {Array} arr2 The second array | |
* @return {Boolean} If true, both arrays are equal | |
*/ | |
const arraysMatch = (arr1, arr2) => { | |
// Check if the arrays are the same length | |
if (arr1.length !== arr2.length) return false; | |
// Check if all items exist and are in the same order | |
for (var i = 0; i < arr1.length; i++) { | |
if (arr1[i] !== arr2[i]) return false; | |
} | |
// Otherwise, return true | |
return true; | |
}; | |
/** | |
* Compare two items and push non-matches to object | |
* @param {*} item1 The first item | |
* @param {*} item2 The second item | |
* @param {String} key The key in our object | |
*/ | |
const compare = (item1, item2, key) => { | |
// Get the object type | |
var type1 = Object.prototype.toString.call(item1); | |
var type2 = Object.prototype.toString.call(item2); | |
// If type2 is undefined it has been removed | |
if (type2 === '[object Undefined]') { | |
diffs[key] = null; | |
return; | |
} | |
// If items are different types | |
if (type1 !== type2) { | |
diffs[key] = item2; | |
return; | |
} | |
// If an object, compare recursively | |
if (type1 === '[object Object]') { | |
const objDiff = objectDiff(item1, item2); | |
if (Object.keys(objDiff).length > 0) { | |
diffs[key] = objDiff; | |
} | |
return; | |
} | |
// If an array, compare | |
if (type1 === '[object Array]') { | |
if (!arraysMatch(item1, item2)) { | |
diffs[key] = item2; | |
} | |
return; | |
} | |
// Else if it's a function, convert to a string and compare | |
// Otherwise, just compare | |
if (type1 === '[object Function]') { | |
if (item1.toString() !== item2.toString()) { | |
diffs[key] = item2; | |
} | |
} else { | |
if (item1 !== item2 ) { | |
diffs[key] = item2; | |
} | |
} | |
}; | |
// Loop through the first object | |
for (key in obj1) { | |
if (obj1.hasOwnProperty(key)) { | |
compare(obj1[key], obj2[key], key); | |
} | |
} | |
// Loop through the second object and find missing items | |
for (key in obj2) { | |
if (obj2.hasOwnProperty(key)) { | |
if (!obj1[key] && obj1[key] !== obj2[key] ) { | |
diffs[key] = obj2[key]; | |
} | |
} | |
} | |
// Return the object of differences | |
return diffs; | |
}; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment