API Docs for: 2.5.3
Show:

File: src/Defaultize/Defaultize.js

/**
	Filling default value to an JavaScript object.

	If tgtVal doesn't have the key -> It is filled from defVal, recursively.

	If tgtVal doesn't have enough values at the Array -> It is filed from defVal, recursively.

		var def, tgt;

		def = {
			a: 1,
			b: 'aaa',
			c: [1, 2, 3]
		};
		tgt = {
			b: 'bbb',
			c: [4]
		};

		glesea.defaultize(def, tgt);

		// tgt ==>  { a: 1, b: 'bbb', c: [4, 2, 3] }

	@method defaultize
	@for glesea

	@param {Object} defVal The default format of the object
	@param {Object} tgtVal The object to be defaultized

	@return {Object} The defaultized object
**/
(function(glesea) {
	glesea.defaultize = function(defVal, tgtVal) {
		if (tgtVal === undefined) {
			tgtVal = JSON.parse(JSON.stringify(defVal));
		} else {
			dfs(defVal, tgtVal, []);
		}

		return tgtVal;
	};

	var dfs = function(def, tgt, stack) {
		switch (typeof(def)) {
			case 'object':
				prepare(def, tgt, stack);
				break;
			default:
				cp(def, tgt, stack);
				return;
		}

		for (var i in def) {
			var newStack = stack.concat([i]);
			dfs(def[i], tgt, newStack);
		}
	};

	var cp = function(def, tgt, stack) {
			var i;

			for (i = 0; i < stack.length - 1; i++) {
				tgt = tgt[stack[i]];
			}

			if (!tgt.hasOwnProperty(stack[i])) {
				tgt[stack[i]] = def;
			}
		},
		prepare = function(def, tgt, stack) {
			var i;

			if (stack.length === 0) return;

			for (i = 0; i < stack.length - 1; i++) {
				tgt = tgt[stack[i]];
			}

			if (!tgt.hasOwnProperty(stack[i])) {
				if (def === null) {
					tgt[stack[i]] = null;
				} else {
					tgt[stack[i]] = Array.isArray(def) ? [] : {};
				}
			}
		};
})(glesea);