in expanded_checklist/visual_interface/src/stores/Utils.ts [94:121]
public objEqual( x: object, y: object): boolean {
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.
// tslint:disable-next-line:no-for-in
for (let i = 0; i < Object.keys(x).length; i++) {
const p = Object.keys(x)[i];
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 ( ! this.objEqual( x[ p ], y[ p ] ) ) { return false; }
// Objects and Arrays must be tested recursively
}
Object.keys(y).forEach(p => {
if ( y.hasOwnProperty( p ) && ! x.hasOwnProperty( p ) ) { return false; }
// allows x[ p ] to be set to undefined
});
return true;
}