UNPKG

@wasmuth/path-set

Version:

Practical, functional utilities that fallback on native implementations as much as possible

26 lines (23 loc) 777 B
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 }