/** * Object utility functions. * * @module engine/utils/object */ /** * Merge any number of associative arrays into first. * * All arguments are expected to be associative arrays. * If same key appears multiple times the final value * will come from last argument that contains it. * * @param {Object} a Objects to merge * @return {object} first argument * * @example * mergeMultiple({ a: { var_1: 1 } }, { a: { var_1: 2 } }); * // return { a: { var_1: 2 } } */ module.exports.mergeMultiple = function mergeMultiple(a) { var i = 0, b, key, value; for (i = 1; i < arguments.length; i++) { b = arguments[i]; for (key in b) { value = b[key]; if (typeof a[key] !== 'undefined') { if (typeof a[key] === 'object') { mergeMultiple(a[key], value); } else { a[key] = value; } } else { a[key] = value; } } } return a; }; /** * Deeply merge an object into the another. * * @param {Object} original Target object to merge to * @param {Object} extended Object to merge to the first one * @return {Object} First object * * @example * merge({ a: { var_1: 1 } }, { a: { var_1: 2 } }); * // return { a: { var_1: 2 } } */ module.exports.merge = function merge(original, extended) { for (var key in extended) { var ext = extended[key]; var extType = typeof ext; if (extType !== 'undefined') { if (extType !== 'object') { // ugly, perhaps there is a better way? if (extType === 'string') { if (ext === 'true') { ext = true; } else if (ext === 'false') { ext = false; } } original[key] = ext; } else { if (!original[key] || typeof(original[key]) !== 'object') { original[key] = Array.isArray(ext) ? [] : {}; } merge(original[key], ext); } } } return original; };