Comparing two json arrays

I have this interval that executes an ajax request, currently every 5 seconds. I have a problem with the if . my code is ALWAYS included in it, and the two json values โ€‹โ€‹are the same, why do they see them as different?

 var newActivity = null, oldActivity = null; setInterval(function(){ $.ajax({ type: "get", url: "/get/new_activity", dataType: "json", success: function(data){ oldActivity = newActivity; newActivity = data; console.log(JSON.stringify(oldActivity)); console.log(JSON.stringify(newActivity)); if(JSON.stringify(oldActivity) != JSON.stringify(newActivity)){ $("#new-activity").slideDown( "fast" ); } } }); }, 5000); 

Edit
Here is the console output (the dashed line is used to separate requests; it is not in the actual output)

 null [{"title":"How many planets are in the solar system?","title_url":"How-many-planets-are-in-the-solar-system%3F","id":"2","answers":"1","asked":"2013-01-11 10:03:50","asked_pretty":"Today","activity":"2013-01-11 12:33:53","activity_pretty":"Today"},{"title":"Why is the sky blue?","title_url":"Why-is-the-sky-blue%3F","id":"1","answers":"1","asked":"2013-01-11 09:55:13","asked_pretty":"Today","activity":"2013-01-11 12:03:45","activity_pretty":"Today"}] --------------------------------------------------- [{"title":"How many planets are in the solar system?","title_url":"How-many-planets-are-in-the-solar-system%3F","id":"2","answers":"1","asked":"2013-01-11 10:03:50","asked_pretty":"Today","activity":"2013-01-11 12:33:53","activity_pretty":"Today"},{"title":"Why is the sky blue?","title_url":"Why-is-the-sky-blue%3F","id":"1","answers":"1","asked":"2013-01-11 09:55:13","asked_pretty":"Today","activity":"2013-01-11 12:03:45","activity_pretty":"Today"}] [{"title":"How many planets are in the solar system?","title_url":"How-many-planets-are-in-the-solar-system%3F","id":"2","answers":"1","asked":"2013-01-11 10:03:50","asked_pretty":"Today","activity":"2013-01-11 12:33:53","activity_pretty":"Today"},{"title":"Why is the sky blue?","title_url":"Why-is-the-sky-blue%3F","id":"1","answers":"1","asked":"2013-01-11 09:55:13","asked_pretty":"Today","activity":"2013-01-11 12:03:45","activity_pretty":"Today"}] --------------------------------------------------- [{"title":"How many planets are in the solar system?","title_url":"How-many-planets-are-in-the-solar-system%3F","id":"2","answers":"1","asked":"2013-01-11 10:03:50","asked_pretty":"Today","activity":"2013-01-11 12:33:53","activity_pretty":"Today"},{"title":"Why is the sky blue?","title_url":"Why-is-the-sky-blue%3F","id":"1","answers":"1","asked":"2013-01-11 09:55:13","asked_pretty":"Today","activity":"2013-01-11 12:03:45","activity_pretty":"Today"}] [{"title":"How many planets are in the solar system?","title_url":"How-many-planets-are-in-the-solar-system%3F","id":"2","answers":"1","asked":"2013-01-11 10:03:50","asked_pretty":"Today","activity":"2013-01-11 12:33:53","activity_pretty":"Today"},{"title":"Why is the sky blue?","title_url":"Why-is-the-sky-blue%3F","id":"1","answers":"1","asked":"2013-01-11 09:55:13","asked_pretty":"Today","activity":"2013-01-11 12:03:45","activity_pretty":"Today"}] 
+2
json javascript jquery
source share
3 answers

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

A better example is a function like this (found on the Internet some time ago, I 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 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; }, 
+4
source share

One solution would be to read json data as text instead of json, and upon successful verification, whether the response line from the server is different from the last line of the response. Then you can call JSON.parse in a string. But this simplifies the comparison and requires only a slight modification to your code.

0
source share

I think you should try to compare their properties.

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

All Articles