Create and Retrieve Nested Objects with jQuery

By  on  

The ability to create and retrieve nested objects by objectified string path is incredibly useful.  Not only do you not need to do the manual string of object/property checks to avoid "{x} is not defined" errors, but if you create your method properly, you can also set an empty object in its given place (or namespace, some would call it.    Here's how you can add this functionality to the jQuery object.

The jQuery JavaScript

Since jQuery's philosophy is to use the same method for getting and setting, we'll be doing this same for creating and retrieving objects;  in this case, we'll use the obj method:

(function() {

	// Utility method to get and set objects that may or may not exist
	var objectifier = function(splits, create, context) {
		var result = context || window;
		for(var i = 0, s; result && (s = splits[i]); i++) {
			result = (s in result ? result[s] : (create ? result[s] = {} : undefined));
		}
		return result;
	};

	// Gets or sets an object
	jQuery.obj = function(name, value, create, context) {
		// Setter
		if(value != undefined) {
			var splits = name.split("."), s = splits.pop(), result = objectifier(splits, true, context);
			return result && s ? (result[s] = value) : undefined;
		}
		// Getter
		else {
			return objectifier(name.split("."), create, context);
		}
	};

})();

As with the MooTools alternative, the objectifier function is enough to handle both getting and setting, as well as doing both within a given context (existing object).  Here are a few examples of how you can use the new jQuery.obj method:

// Check for existence
var moduleNameExists = jQuery.obj("mynamespace.widget.moduleName"); // undefined

// Create the obj
jQuery.obj("mynamespace.widget.moduleName", { prop: 1 }); // mynamespace.widget.moduleName.prop returns 1

// Create an object on existing object
jQuery.obj("subnamespace.subModuleName", { someProp: 8 }, true, mynamespace.widget);
	// mynamespace.widget.subnamespace.subModuleName = { someProp: 8 }

As I work more with jQuery, both with its provided methods and other third party tools, accessing arbitrary objects by string and sometimes context allows me to avoid the dance of manual object and property existence checks.  Of course the essence of this script is really the objectifier method, which can be added to any framework or toolkit, but with a framework as popular as jQuery, why not just put it out there for everyone?

Recent Features

  • By
    JavaScript Promise API

    While synchronous code is easier to follow and debug, async is generally better for performance and flexibility. Why "hold up the show" when you can trigger numerous requests at once and then handle them when each is ready?  Promises are becoming a big part of the JavaScript world...

  • By
    9 More Mind-Blowing WebGL Demos

    With Firefox OS, asm.js, and the push for browser performance improvements, canvas and WebGL technologies are opening a world of possibilities.  I featured 9 Mind-Blowing Canvas Demos and then took it up a level with 9 Mind-Blowing WebGL Demos, but I want to outdo...

Incredible Demos

  • By
    CSS Kwicks

    One of the effects that made me excited about client side and JavaScript was the Kwicks effect.  Take a list of items and react to them accordingly when hovered.  Simple, sweet.  The effect was originally created with JavaScript but come five years later, our...

  • By
    Control Element Outline Position with outline-offset

    I was recently working on a project which featured tables that were keyboard navigable so obviously using cell outlining via traditional tabIndex=0 and element outlines was a big part of allowing the user navigate quickly and intelligently. Unfortunately I ran into a Firefox 3.6 bug...

Discussion

  1. Any chance that there is a demo or functional example of this available? I’m trying to use this to create nested dropdown boxes based on jQuery UI’s nested menu, and I’m having some difficulty understanding how to apply the objectifier function.

Wrap your code in <pre class="{language}"></pre> tags, link to a GitHub gist, JSFiddle fiddle, or CodePen pen to embed!