Spaces:
Sleeping
Sleeping
| var clone = require('./clone'); | |
| module.exports = merge; | |
| function typesMatch(a, b) { | |
| return (typeof a === typeof b) && (Array.isArray(a) === Array.isArray(b)); | |
| } | |
| /** | |
| * A deep merge of the source based on the target. | |
| * @param {Object} source [description] | |
| * @param {Object} target [description] | |
| * @return {Object} [description] | |
| */ | |
| function merge(source, target, result) { | |
| if (result === undefined) { | |
| result = clone(source); | |
| } | |
| // merge missing values from the target to the source | |
| Object.getOwnPropertyNames(target).forEach(function (key) { | |
| if (source[key] === undefined) { | |
| result[key] = target[key]; | |
| } | |
| }); | |
| Object.getOwnPropertyNames(source).forEach(function (key) { | |
| var value = source[key]; | |
| if (target[key] && typesMatch(value, target[key])) { | |
| // merge empty values | |
| if (value === '') { | |
| result[key] = target[key]; | |
| } | |
| if (Array.isArray(value)) { | |
| if (value.length === 0 && target[key].length) { | |
| result[key] = target[key].slice(0); | |
| } | |
| } else if (typeof value === 'object') { | |
| result[key] = merge(value, target[key]); | |
| } | |
| } | |
| }); | |
| return result; | |
| } |