deep-map-keys

Transforms nested keys of complex objects

Downloads in past

Stats

StarsIssuesVersionUpdatedCreatedSize
deep-map-keys
2162.0.15 years ago8 years agoMinified + gzip package size for deep-map-keys in KB

Readme

Deep Map Keys
!Versionversion-badgenpm !Licenselicense-badgelicense !Buildbuild-badgetravis !Coveragecoverage-badgecoveralls
Install | Usage | API | TypeScript | 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 Mapdeep-map.

Install

Install Deep Map Keys via npmnpm.
npm install --save deep-map-keys

Usage

Suppose we want to change the keys of an object from snake casesnake-case to camel casecamel-case. We can do something like this:
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:
{
  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

<tr>
  <th align="left">Param</th>
  <th align="left">Type</th>
  <th align="left">Description</th>
</tr>
<tr>
  <td>object</td>
  <td><code>any</code></td>
  <td>
    The object whose keys are to be transformed. Typically, this will be
    a complex object containing other nested objects. This object may be an
    <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array">
    <code>Array</code></a>, in which case the keys of any objects it
    contains will be transformed. The object may contain circular
    references.
  </td>
</tr>
<tr>
  <td>mapFn</td>
  <td><code>function</code></td>
  <td>
    The function used to transform each key. The function is
    called with two arguments:
    <ul>
      <li>
        <strong>key</strong> <<code>string</code>>
        The key being transformed
      </li>
      <li>
        <strong>value</strong> <<code>any</code>>
        The value of the node whose key is being transformed
      </li>
    </ul>
    The return value determines the new name of the key, and must therefore
    be a string.
  </td>
</tr>
<tr>
  <td>[options]</td>
  <td><code>object</code></td>
  <td>
    An optional options object. The following option is accepted:
    <ul>
      <li>
        <strong>thisArg</strong> <<code>any=undefined</code>>
        Sets the value of
        <a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this"><code>this</code></a>
        within <code>mapFn()</code>
      </li>
    </ul>
  </td>
</tr>

Returns

Returns a new object.

TypeScript

TypeScripttypescript 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.
interface Result {
  userName: string;
}

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

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

License

Copyright © 2016–2019 Akim McMath. Licensed under the MIT Licenselicense.