senäh

17senäh und so…

Code Snippet Thumb

HTML/CSS/JS
24. Okt 2011
Kommentare: 0

Code Snippet: Deep Copies von Objekten in jQuery (ohne Arrays!)

Kategorien: HTML/CSS/JS | 24. Okt 2011 | Kommentare: 0

Hi Freunde der Sonne!

Eben bin ich auf einen der raren Momente gestoßen, in denen mir die Standardfunktionen von jQuery nicht gereicht haben und ich nicht auf den ersten Seiten bei Google ein entsprechendes Plugin für die gesuchte Funktion gefunden habe. Vielleicht habe ich aber auch nur nicht lange genug gesucht. Damit zumindest ihr nicht lange suchen müsst, stelle ich die Funktion online.

Um welche Funktion geht es? Um das Erstellen einer deep copy von Objekten. Dies erfolgt in jQuery über die extend() Funktion. Dummerweise werden dabei nicht nur Objekte, sondern auch Arrays gemerged, was ich (und anscheinend auch andere) nicht immer für sinnvoll erachte. Hier also eine Funktion, welche lediglich Objekte merged und Arrays ggf. komplett ersetzt.

Verwendet dazu einfach meine Funktion jQuery.extendObj(), welche genauso benutzt werden kann wie jQuery.extend(). Genau genommen ist extendObj() zu 99% die gleiche Funktion wie extend() nur das ich einen kleinen Codeschnipsel herausgenommen habe, welcher deep copies von Arrays erstellt hat.

/* CUSTOM EXTEND (DEEP EXTENDING, BUT ONLY FOR OBJECTS, NOT ARRAYS) */

jQuery.extendObj = jQuery.fn.extendObj = function() {
	var options, name, src, copy, clone,
		target = arguments[0] || {},
		i = 1,
		length = arguments.length,
		deep = false;

	// Handle a deep copy situation
	if ( typeof target === "boolean" ) {
		deep = target;
		target = arguments[1] || {};
		// skip the boolean and the target
		i = 2;
	}

	// Handle case when target is a string or something (possible in deep copy)
	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
		target = {};
	}

	// extend jQuery itself if only one argument is passed
	if ( length === i ) {
		target = this;
		--i;
	}

	for ( ; i < length; i++ ) {
		// Only deal with non-null/undefined values
		if ( (options = arguments[ i ]) != null ) {
			// Extend the base object
			for ( name in options ) {
				src = target[ name ];
				copy = options[ name ];

				// Prevent never-ending loop
				if ( target === copy ) {
					continue;
				}

				// Recurse if we're merging plain objects
				if ( deep && copy && jQuery.isPlainObject(copy) ) {
					clone = src && jQuery.isPlainObject(src) ? src : {};

					// Never move original objects, clone them
					target[ name ] = jQuery.extendObj( deep, clone, copy );

				// Don't bring in undefined values
				} else if ( copy !== undefined ) {
					target[ name ] = copy;
				}
			}
		}
	}

	// Return the modified object
	return target;
};

Und warum brauche ich das Ganze? Das kann ich euch vielleicht morgen zeigen 😉

Autor: Pipo

...kommt ursprünglich aus der Designerecke, ist aber im Laufe seines Studiums in die Webentwicklung gestolpert. Kann sich seit dem nicht so richtig entscheiden wo er hingehört und wagt deswegen vielleicht die Flucht nach vorne in ein komplett neues Gebiet. Vielleicht Management? Niemand weiß es. Auch er nicht.