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 json values are the exact same, why is it seeing 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 (dashed line is to separate requests, it isn't 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"}]
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 json values are the exact same, why is it seeing 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 (dashed line is to separate requests, it isn't 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"}]
Share
Improve this question
edited Jan 11, 2013 at 21:22
Get Off My Lawn
asked Jan 11, 2013 at 21:09
Get Off My LawnGet Off My Lawn
36.3k46 gold badges197 silver badges374 bronze badges
18
-
1
Please post the actual values resulting from the JSON stringification of
newActivity
andoldActivity
. If they contain objects then there is no guarantee of ordering or equality in JSON form. (The are other encodings that are equivalent but not identical; they are less mon.) – user166390 Commented Jan 11, 2013 at 21:21 - 1 @Christophe Except it was not correct at all, given with the first output listing. – user166390 Commented Jan 11, 2013 at 21:27
- 1 @Christophe pst is correct, I deleted my answer because it was wrong. – bfavaretto Commented Jan 11, 2013 at 21:29
- 2 @Christophe: The fact that his code says they are different. – gen_Eric Commented Jan 11, 2013 at 21:35
-
2
I am an idiot. I reset
newActivity
tonull
in a different function. That is why they were ing back as not equal every time. – Get Off My Lawn Commented Jan 11, 2013 at 21:41
3 Answers
Reset to default 10JSON 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 pare 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 paring 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;
},
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 parison much easier and should only need a slight modification of your code.
I think you should try paring their properties.
for(var property in JSON.stringify(oldActivity))
{
if(JSON.stringify(oldActivity)[property]!=JSON.stringify(newActivity)[property])
$("#new-activity").slideDown( "fast" );
}