@wasmuth/path-set
Version:
Practical, functional utilities that fallback on native implementations as much as possible
26 lines (23 loc) • 777 B
JavaScript
import check from 'check-arg-types'
import deepClone from '@wasmuth/deep-clone'
import merge from '@wasmuth/merge'
import partial from '@wasmuth/partial'
import reduce from '@wasmuth/reduce'
export default function pathSet (paths, valToSet, object) {
if (arguments.length < 3) return partial(pathSet, arguments)
check(arguments, [['array', 'string'], '-any', ['object', 'array']])
if (check.prototype.toType(paths) === 'string') paths = paths.split('.')
const copy = check.prototype.toType(paths) === 'object' ? merge({}, object) : deepClone(object)
reduce(
(obj, prop, idx) => {
obj[prop] = obj[prop] || {}
if (paths.length === (idx + 1)) {
obj[prop] = valToSet
}
return obj[prop]
},
copy,
paths
)
return copy
}