Created
August 20, 2022 22:35
-
-
Save shepelevstas/4ca6cc8cefc8458887b50e29dd17ac61 to your computer and use it in GitHub Desktop.
deep equal js
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
function deepEq( x, y, propertyList, pred ) { | |
if ( x === y ) return true; | |
// if both x and y are null or undefined and exactly the same | |
if ( ! ( x instanceof Object ) || ! ( y instanceof Object ) ) return false; | |
// if they are not strictly equal, they both need to be Objects | |
if ( x.constructor !== y.constructor ) return false; | |
// they must have the exact same prototype chain, the closest we can do is | |
// test there constructor. | |
if (propertyList){ | |
for (var p in propertyList){ | |
if (!x.hasOwnProperty(p)^!y.hasOwnProperty(p)) return false | |
// if (!y.hasOwnProperty(p)) return false | |
if (x[p]===y[p]) continue | |
if (typeof(x[p]!=='object')) return false | |
if (!deepEq(x[p], y[p])) return false | |
} | |
} else { | |
var pred_tmp; | |
for ( var p in x ) { | |
if (pred){ | |
pred_tmp = pred(x[p],y[p],x,y,p) | |
if (pred_tmp===false) return false; | |
else if (pred_tmp===true) continue; | |
} | |
if ( ! x.hasOwnProperty( p ) ) continue; | |
// other properties were tested using x.constructor === y.constructor | |
if ( ! y.hasOwnProperty( p ) ) return false; | |
// allows to compare x[ p ] and y[ p ] when set to undefined | |
if ( x[ p ] === y[ p ] ) continue; | |
// if they have the same strict value or identity then they are equal | |
if ( typeof( x[ p ] ) !== "object" ) return false; | |
// Numbers, Strings, Functions, Booleans must be strictly equal | |
if ( ! deepEq( x[ p ], y[ p ] ) ) return false; | |
// Objects and Arrays must be tested recursively | |
} | |
for ( p in y ) { | |
if ( y.hasOwnProperty( p ) && ! x.hasOwnProperty( p ) ) return false; | |
// allows x[ p ] to be set to undefined | |
} | |
} | |
return true; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment