merge-recursive
Version:
A merge utility support recursive merges
73 lines (62 loc) • 1.52 kB
JavaScript
// Flat merge
module.exports = exports = function(host) {
var donors = slice(arguments, 1);
donors.forEach(function(donor) {
Object.keys(donor).forEach(function(key) {
host[key] = donor[key];
});
});
return host;
};
// Flat, selective merge
exports.selective = function(keys, host) {
var donors = slice(arguments, 1);
donors.forEach(function(donor) {
keys.forEach(function(key) {
host[key] = donor[key];
});
});
return host;
};
// Recursive merge
exports.recursive = function(host) {
var donors = slice(arguments, 1);
donors.forEach(function(donor) {
Object.keys(donor).forEach(recurser(host, donor));
});
return host;
};
// Recursive, selective merge
exports.selective.recursive = function(keys, host) {
var donors = slice(arguments, 1);
donors.forEach(function(donor) {
keys.forEach(recurser(host, donor));
});
return host;
};
// Helpers
function slice(arr, i) {
return Array.prototype.slice.call(arr, i);
}
function isObj(value) {
return !! (typeof value === 'object' && value);
}
function getType(value) {
return Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
}
function recurser(host, donor) {
return function(key) {
if (isObj(donor[key])) {
if (isObj(host[key])) {
exports.recursive(host[key], donor[key]);
} else {
var base = Array.isArray(donor[key]) ? [ ] : { };
host[key] = exports.recursive(base, donor[key]);
}
} else {
host[key] = donor[key];
}
};
}
/* End of file index.js */
/* Location: ./lib/index.js */