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