Merge pull request #885 from iaptsiauri/deepMapKeys

[FEATURE] adds deepMapKeys snippet
This commit is contained in:
Angelos Chalaris
2018-12-10 11:50:35 +02:00
committed by GitHub
3 changed files with 87 additions and 0 deletions

54
snippets/deepMapKeys.md Normal file
View File

@ -0,0 +1,54 @@
### 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' ]
}
]
}
}
}
*/
```

View File

@ -50,6 +50,7 @@ decapitalize:string,array,intermediate
deepClone:object,recursion,intermediate
deepFlatten:array,recursion,intermediate
deepFreeze:object,recursion,intermediate
deepMapKeys:object,recursion,advanced
defaults:object,intermediate
defer:function,intermediate
degreesToRads:math,beginner

32
test/deepMapKeys.test.js Normal file
View File

@ -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);
});