the reminder not showing content on the card at dashboard view and the quizes are hardcoded must move to the db make api's for it
47 lines
1.2 KiB
JavaScript
47 lines
1.2 KiB
JavaScript
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;
|
|
} |