Skip to content

Instantly share code, notes, and snippets.

@shepelevstas
Created August 20, 2022 22:35
Show Gist options
  • Save shepelevstas/4ca6cc8cefc8458887b50e29dd17ac61 to your computer and use it in GitHub Desktop.
Save shepelevstas/4ca6cc8cefc8458887b50e29dd17ac61 to your computer and use it in GitHub Desktop.
deep equal js
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