Create and Retrieve Nested Objects with jQuery

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 }