blob: 2a19cde4b58ce4d9daf3a65452c73aa6e4dce9fa [file] [log] [blame]
'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;
};