Repository URL to install this package:
|
Version:
6.0.4 ▾
|
/* istanbul ignore next: WIP */
import ObjectKeys from '../util/keys'
import {isMap, isFalse} from '../is'
import reduce from '../reduce'
import dopemerge from './dopemerge'
/**
* merge maps & sets
* @memberOf dopemerge
*
* @param {Map | Set} obj1 merge with 2
* @param {Map | Set} obj2 merge with 1
* @return {Map | Set} merged
*
* @TODO easy clone
*
* @example
*
* 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})
*
*/
export default function dopemergeMap<Value = any>(obj1: Map<string, Value>, obj2: Map<string, Value>) {
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 (const key of keys) {
if (isFalse(dest.has(key))) {
dest.set(key, src[key])
}
else {
dest.set(key, dopemerge(dest.get(key), src[key]))
}
}
return dest
}