|
|
- '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;
- };
|