Skip to content

Instantly share code, notes, and snippets.

@kofrasa
Last active November 22, 2018 10:59
Show Gist options
  • Save kofrasa/5a6264b5b9afd41bd3def1bb04f6e5cf to your computer and use it in GitHub Desktop.
Save kofrasa/5a6264b5b9afd41bd3def1bb04f6e5cf to your computer and use it in GitHub Desktop.
merge function for mingo
function isArray(v) { return !!v && v.constructor === Array }
function isObject(v) { return !!v && v.constructor === Object }
function merge(target, obj, opt) {
// take care of null inputs
if (!isObject(target) && !isArray(obj) || !isObject(target) && !isArray(obj)) return obj
if (!(isArray(target) && isArray(obj) || isObject(target) && isObject(obj))) {
throw Error('mismatched types. must both be array or object')
}
opt = opt || {}
opt.flatten = opt.flatten || false
if (isArray(target)) {
Array.prototype.push.apply(target, obj)
let flatten = opt.flatten && !target.some((v) => !isObject(v))
if (flatten) {
let tgt = target[0]
for (let i = 1; i < target.length; i++) {
tgt = merge(tgt, target[i])
}
target.splice(0, target.length)
target.push(tgt)
}
} else {
Object.keys(obj).forEach((k,v) => {
if (target.hasOwnProperty(k)) {
target[k] = merge(target[k], obj[k])
} else {
target[k] = obj[k]
}
})
}
return target
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment