added compareObject function to mediaWiki core jQuery prototyping utilities
authorKrinkle <krinkle@users.mediawiki.org>
Mon, 13 Dec 2010 23:52:45 +0000 (23:52 +0000)
committerKrinkle <krinkle@users.mediawiki.org>
Mon, 13 Dec 2010 23:52:45 +0000 (23:52 +0000)
resources/mediawiki/mediawiki.js

index 0f3a10b..fc7aa10 100644 (file)
@@ -50,6 +50,67 @@ jQuery.extend({
                        }
                }
                return true;
+       },
+       compareObject : function( objectA, objectB ) {
+       
+               // Do a simple check if the types match
+               if ( typeof( objectA ) == typeof( objectB ) ) {
+       
+                       // Only loop over the contents if it really is an object
+                       if ( typeof( objectA ) == 'object' ) {
+                               // If they are aliases of the same object (ie. mw and mediaWiki) return now
+                               if ( objectA === objectB ) {
+                                       return true;
+                               } else {
+                                       // Iterate over each property
+                                       for ( var prop in objectA ) {
+                                               // Check if this property is also present in the other object
+                                               if ( prop in objectB ) {
+                                                       // Compare the types of the properties
+                                                       var type = typeof( objectA[prop] );
+                                                       if ( type == typeof( objectB[prop] ) ) {
+                                                               // Recursively check objects inside this one
+                                                               switch ( type ) {
+                                                                       case 'object' :
+                                                                               if ( !$.compareObject( objectA[prop], objectB[prop] ) ) {
+                                                                                       return false;
+                                                                               }
+                                                                               break;
+                                                                       case 'function' :
+                                                                               // Functions need to be strings to compare them properly
+                                                                               if ( objectA[prop].toString() !== objectB[prop].toString() ) {
+                                                                                       return false;
+                                                                               }
+                                                                               break;
+                                                                       default:
+                                                                               // Strings, numbers
+                                                                               if ( objectA[prop] !== objectB[prop] ) {
+                                                                                       return false;
+                                                                               }
+                                                                               break;
+                                                               }
+                                                       } else {
+                                                               return false;
+                                                       }
+                                               } else {
+                                                       return false;
+                                               }
+                                       }
+                                       // Check for properties in B but not in A
+                                       // This is about 15% faster (tested in Safari 5 and Firefox 3.6)
+                                       // ...than incrementing a count variable in the above and below loops
+                                       // See also: http://www.mediawiki.org/wiki/ResourceLoader/Default_modules/compareObject_test#Results
+                                       for ( var prop in objectB ) {
+                                               if ( !( prop in objectA ) ) {
+                                                       return false;
+                                               }
+                                       }
+                               }
+                       }
+               } else {
+                       return false;
+               }
+               return true;
        }
 });