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);