| 'use strict'; |
| |
| // customized for this use-case |
| const isObject = x => |
| typeof x === 'object' && |
| x !== null && |
| !(x instanceof RegExp) && |
| !(x instanceof Error) && |
| !(x instanceof Date); |
| |
| module.exports = function mapObj(obj, fn, opts, seen) { |
| opts = Object.assign({ |
| deep: false, |
| target: {} |
| }, opts); |
| |
| seen = seen || new WeakMap(); |
| |
| if (seen.has(obj)) { |
| return seen.get(obj); |
| } |
| |
| seen.set(obj, opts.target); |
| |
| const target = opts.target; |
| delete opts.target; |
| |
| for (const key of Object.keys(obj)) { |
| const val = obj[key]; |
| const res = fn(key, val, obj); |
| let newVal = res[1]; |
| |
| if (opts.deep && isObject(newVal)) { |
| if (Array.isArray(newVal)) { |
| newVal = newVal.map(x => isObject(x) ? mapObj(x, fn, opts, seen) : x); |
| } else { |
| newVal = mapObj(newVal, fn, opts, seen); |
| } |
| } |
| |
| target[res[0]] = newVal; |
| } |
| |
| return target; |
| }; |