chain-able
Version:
interfaces that describe their intentions.
60 lines (52 loc) • 1.3 kB
JavaScript
const ObjectKeys = require('../util/keys')
const isMap = require('../is/map')
const isFalse = require('../is/false')
const reduce = require('../reduce')
const dopemerge = require('./dopemerge')
function dopemergeMap(obj1, obj2) {
const oneIsMap = isMap(obj1)
const twoIsMap = isMap(obj2)
// eslint-disable-next-line
const eq = (one, two) => oneIsMap == one && twoIsMap == two
let dest = obj1
let src = obj2
/* prettier-ignore */
// both maps
if (eq(true, true)) {
src = reduce(obj2)
}
// obj1 is map
else if (eq(true, false)) {
src = obj2
}
// obj2 is map
else if (eq(false, true)) {
src = reduce(obj2)
}
// false, false
else {
return dopemerge(obj1, obj2)
}
const keys = ObjectKeys(src)
for (var i = 0; i < keys.length; i++) {
const key = keys[i]
if (isFalse(dest.has(key))) {
dest.set(key, src[key])
}
else {
dest.set(key, dopemerge(dest.get(key), src[key]))
}
}
return dest
}
// test
var targetMap = new Map()
targetMap.set('true', false)
targetMap.set('obj', {obj: []})
targetMap.set('arr', [1])
var srcMap = new Map()
srcMap.set('true', true)
srcMap.set('obj', {obj: [Symbol]})
srcMap.set('arr', [2])
srcMap.set('emptyArr', [])
var mergedMap = dopemergeMap(targetMap, srcMap, {clone: true})