### deepMapKeys Deep maps an object keys. Creates an object with the same values as the provided object and keys generated by running the provided function for each key. Use `Object.keys(obj)` to iterate over the object's keys. Use `Array.prototype.reduce()` to create a new object with the same values and mapped keys using `fn`. ```js const deepMapKeys = (obj, f) => ( Array.isArray(obj) ? obj.map(val => deepMapKeys(val, f)) : (typeof obj === 'object') ? Object.keys(obj).reduce((acc, current) => { const val = obj[current]; acc[f(current)] = (val !== null && typeof val === 'object') ? deepMapKeys(val, f) : acc[f(current)] = val; return acc; }, {}) : obj ); ``` ```js const obj = { foo:'1', nested:{ child:{ withArray:[ { grandChild:[ 'hello' ] } ] } } }; const upperKeysObj = deepMapKeys(obj, (key) => key.toUpperCase()); /* { "FOO":"1", "NESTED":{ "CHILD":{ "WITHARRAY":[ { "GRANDCHILD":[ 'hello' ] } ] } } } */ ```