Sha256: 98f7c6c67dd5424c17294d910cf3fa5d49ef1f470cd65bc444872b699c776a7f
Contents?: true
Size: 1.53 KB
Versions: 1
Compression:
Stored size: 1.53 KB
Contents
'use strict'; const isObject = value => typeof value === 'object' && value !== null; const mapObjectSkip = Symbol('skip'); // Customized for this use-case const isObjectCustom = value => isObject(value) && !(value instanceof RegExp) && !(value instanceof Error) && !(value instanceof Date); const mapObject = (object, mapper, options, isSeen = new WeakMap()) => { options = { deep: false, target: {}, ...options }; if (isSeen.has(object)) { return isSeen.get(object); } isSeen.set(object, options.target); const {target} = options; delete options.target; const mapArray = array => array.map(element => isObjectCustom(element) ? mapObject(element, mapper, options, isSeen) : element); if (Array.isArray(object)) { return mapArray(object); } for (const [key, value] of Object.entries(object)) { const mapResult = mapper(key, value, object); if (mapResult === mapObjectSkip) { continue; } let [newKey, newValue, {shouldRecurse = true} = {}] = mapResult; // Drop `__proto__` keys. if (newKey === '__proto__') { continue; } if (options.deep && shouldRecurse && isObjectCustom(newValue)) { newValue = Array.isArray(newValue) ? mapArray(newValue) : mapObject(newValue, mapper, options, isSeen); } target[newKey] = newValue; } return target; }; module.exports = (object, mapper, options) => { if (!isObject(object)) { throw new TypeError(`Expected an object, got \`${object}\` (${typeof object})`); } return mapObject(object, mapper, options); }; module.exports.mapObjectSkip = mapObjectSkip;
Version data entries
1 entries across 1 versions & 1 rubygems
Version | Path |
---|---|
trusty-cms-6.3.1 | node_modules/camelcase-keys/node_modules/map-obj/index.js |