diff --git a/snippets/deepMapKeys.md b/snippets/deepMapKeys.md new file mode 100644 index 000000000..01841e8de --- /dev/null +++ b/snippets/deepMapKeys.md @@ -0,0 +1,59 @@ +### 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 +'use strict'; +const obj = { + foo:'1', + isnull:null, + nested:{ + bar:'1', + child:{ + withArray:[ + { + grandChild:[ 'hello' ] + } + ] + } + } +} +const upperKeysObj = deepMapKeys(obj, (key) => key.toUpperCase()); +/* +Formatted JSON Data +{ + "FOO":"1", + "ISNULL":null, + "NESTED":{ + "BAR":"1", + "CHILD":{ + "WITHARRAY":[ + { + "GRANDCHILD":[ 'hello' ] + } + ] + } + } +} +*/ +``` diff --git a/tag_database b/tag_database index 436fb8869..64ec9dc6a 100644 --- a/tag_database +++ b/tag_database @@ -50,6 +50,7 @@ decapitalize:string,array,intermediate deepClone:object,recursion,intermediate deepFlatten:array,recursion,intermediate deepFreeze:object,recursion,intermediate +deepMapKeys:object,recursion defaults:object,intermediate defer:function,intermediate degreesToRads:math,beginner diff --git a/test/deepMapKeys.test.js b/test/deepMapKeys.test.js new file mode 100644 index 000000000..4a56d70fc --- /dev/null +++ b/test/deepMapKeys.test.js @@ -0,0 +1,32 @@ +const expect = require('expect'); +const { deepMapKeys, toCamelCase } = require('./_30s.js'); + +test('deepMapKeys is a Function', () => { + expect(deepMapKeys).toBeInstanceOf(Function); +}); + +test('Deep maps object keys', () => { + const obj = { + 'foo_bar': 'hello', + 'deep_child': { + 'child_array': ['hello'], + 'child_object_array': [ + { 'hola_hello': 'Gamarjoba' } + ] + } + }; + const expected = { + fooBar: 'hello', + deepChild: { + childArray: ['hello'], + childObjectArray: [ + { + holaHello: 'Gamarjoba' + } + ] + } + }; + const camleCaseKeys = k => toCamelCase(k); + expect(deepMapKeys(obj, camleCaseKeys)).toEqual(expected); +}); +