An open API service indexing awesome lists of open source software.

https://github.com/mcmath/deep-map-keys

Transforms nested keys of complex objects
https://github.com/mcmath/deep-map-keys

Last synced: 10 months ago
JSON representation

Transforms nested keys of complex objects

Awesome Lists containing this project

README

          

# Deep Map Keys

[![Version][version-badge]][npm]
[![License][license-badge]][license]
[![Build][build-badge]][travis]
[![Coverage][coverage-badge]][coveralls]

[Install](#install) | [Usage](#usage) | [API](#api) | [TypeScript](#typescript) | [License](#license)

**Deep Map Keys** recurses through an object and transforms its keys – and
the keys of any nested objects – according to some function. Circular
references are supported.

To transform the *values* of an object rather than its keys, use
[Deep Map][deep-map].

## Install

Install Deep Map Keys via [npm][npm].

```sh
npm install --save deep-map-keys
```

## Usage

Suppose we want to change the keys of an object from [snake case][snake-case] to
[camel case][camel-case]. We can do something like this:

```js
const deepMapKeys = require('deep-map-keys');

let comment = {
comment_id: 42,
user_id: 1024,
user_name: 'Mufasa',
content: 'You deliberately disobeyed me.',
viewed_by: [
{ user_id: 3820, user_name: 'Rafiki' },
{ user_id: 8391, user_name: 'Zazu' }
]
};

function snakeToCamel(key) {
return key.replace(/_(\w)/g, (match, char) => char.toUpperCase());
}

let result = deepMapKeys(comment, snakeToCamel);
```

And the result will look like this:

```js
{
commentId: 42,
userId: 1024,
userName: 'Mufasa',
content: 'You deliberately disobeyed me.',
viewedBy: [
{ userId: 3820, userName: 'Rafiki' },
{ userId: 8391, userName: 'Zazu' }
]
}
```

## API

#### `deepMapKeys(object, mapFn, [options])`

#### Parameters



Param
Type
Description




object
any

The object whose keys are to be transformed. Typically, this will be
a complex object containing other nested objects. This object may be an

Array
, in which case the keys of any objects it
contains will be transformed. The object may contain circular
references.



mapFn
function

The function used to transform each key. The function is
called with two arguments:



  • key <string>
    The key being transformed


  • value <any>
    The value of the node whose key is being transformed


The return value determines the new name of the key, and must therefore
be a string.



[options]
object

An optional options object. The following option is accepted:


  • thisArg <any=undefined>
    Sets the value of
    this
    within mapFn()




#### Returns

Returns a new object.

## TypeScript

[TypeScript][typescript] declarations are included in the package. Just import
the module, and things will just work.

The shape of the returned object cannot be inferred from the inputs; however it
can be defined by passing a single type argument.

```ts
interface Result {
userName: string;
}

let result = deepMapKeys({user_name: 'Pumbaa'}, snakeToCamel);

let name = result.userName; // Everything is OK :)
```

## License

Copyright © 2016–2019 Akim McMath. Licensed under the [MIT License][license].

[version-badge]: https://img.shields.io/npm/v/deep-map-keys.svg?style=flat-square
[license-badge]: https://img.shields.io/npm/l/deep-map-keys.svg?style=flat-square
[build-badge]: https://img.shields.io/travis/mcmath/deep-map-keys/master.svg?style=flat-square
[coverage-badge]: https://img.shields.io/coveralls/mcmath/deep-map-keys/master.svg?style=flat-square&service=github
[npm]: https://www.npmjs.com/package/deep-map-keys
[license]: LICENSE
[travis]: https://travis-ci.org/mcmath/deep-map-keys
[coveralls]: https://coveralls.io/github/mcmath/deep-map-keys?branch=master
[deep-map]: https://github.com/mcmath/deep-map
[snake-case]: https://en.wikipedia.org/wiki/Snake_case
[camel-case]: https://en.wikipedia.org/wiki/CamelCase
[typescript]: http://www.typescriptlang.org/