public objEqual()

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;
    }