Created
January 10, 2017 17:28
-
-
Save michael-mafi/a91bb06c286778373684ec5f6ca21e3b to your computer and use it in GitHub Desktop.
Object comparison in 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
| Object.equals = function( x, y ) { | |
| 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. | |
| for ( var p in x ) { | |
| 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 ( ! Object.equals( 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