Comparing two json arrays

后端 未结 3 1424
忘掉有多难
忘掉有多难 2020-12-21 00:57

I have this interval, that does an ajax request, currently every 5 seconds. I am having an issue with the if statement. my code ALWAYS enters it, and the two js

相关标签:
3条回答
  • 2020-12-21 01:31

    JSON objects are not guaranteed to be serialized the same way, properties are not guaranteed to be in the same order, using JSON.stringify is not a good way to test object equality.

    A better example is a function like (found on the internet a while ago, wish I could give credit to the original author)

    /**
     * Deep compare of two objects.
     *
     * Note that this does not detect cyclical objects as it should.
     * Need to implement that when this is used in a more general case. It's currently only used
     * in a place that guarantees no cyclical structures.
     *
     * @param {*} x
     * @param {*} y
     * @return {Boolean} Whether the two objects are equivalent, that is,
     *         every property in x is equal to every property in y recursively. Primitives
     *         must be strictly equal, that is "1" and 1, null an undefined and similar objects
     *         are considered different
     */
    function equals ( x, y ) {
        // If both x and y are null or undefined and exactly the same
        if ( x === y ) {
            return true;
        }
    
        // If they are not strictly equal, they both need to be Objects
        if ( ! ( x instanceof Object ) || ! ( y instanceof Object ) ) {
            return false;
        }
    
        // They must have the exact same prototype chain, the closest we can do is
        // test the constructor.
        if ( x.constructor !== y.constructor ) {
            return false;
        }
    
        for ( var p in x ) {
            // Inherited properties were tested using x.constructor === y.constructor
            if ( x.hasOwnProperty( p ) ) {
                // Allows comparing x[ p ] and y[ p ] when set to undefined
                if ( ! y.hasOwnProperty( p ) ) {
                    return false;
                }
    
                // If they have the same strict value or identity then they are equal
                if ( x[ p ] === y[ p ] ) {
                    continue;
                }
    
                // Numbers, Strings, Functions, Booleans must be strictly equal
                if ( typeof( x[ p ] ) !== "object" ) {
                    return false;
                }
    
                // Objects and Arrays must be tested recursively
                if ( !equals( x[ p ],  y[ p ] ) ) {
                    return false;
                }
            }
        }
    
        for ( p in y ) {
            // allows x[ p ] to be set to undefined
            if ( y.hasOwnProperty( p ) && ! x.hasOwnProperty( p ) ) {
                return false;
            }
        }
        return true;
    },
    
    0 讨论(0)
  • 2020-12-21 01:50

    One solution would be to read the json data as text instead of json, and on success you check if the response string from the server differs from the last response string. Then you can call JSON.parse on the string. But this makes the comparison much easier and should only need a slight modification of your code.

    0 讨论(0)
  • 2020-12-21 01:51

    I think you should try comparing their properties.

    
    for(var property in JSON.stringify(oldActivity))
        {
          if(JSON.stringify(oldActivity)[property]!=JSON.stringify(newActivity)[property])
                       $("#new-activity").slideDown( "fast" );
        }
        

    0 讨论(0)
提交回复
热议问题