|
|
# flat [](http://travis-ci.org/hughsk/flat)
Take a nested Javascript object and flatten it, or unflatten an object withdelimited keys.
## Installation
``` bash$ npm install flat```
## Methods
### flatten(original, options)
Flattens the object - it'll return an object one level deep, regardless of hownested the original object was:
``` javascriptvar flatten = require('flat')
flatten({ key1: { keyA: 'valueI' }, key2: { keyB: 'valueII' }, key3: { a: { b: { c: 2 } } }})
// {// 'key1.keyA': 'valueI',// 'key2.keyB': 'valueII',// 'key3.a.b.c': 2// }```
### unflatten(original, options)
Flattening is reversible too, you can call `flatten.unflatten()` on an object:
``` javascriptvar unflatten = require('flat').unflatten
unflatten({ 'three.levels.deep': 42, 'three.levels': { nested: true }})
// {// three: {// levels: {// deep: 42,// nested: true// }// }// }```
## Options
### delimiter
Use a custom delimiter for (un)flattening your objects, instead of `.`.
### safe
When enabled, both `flat` and `unflatten` will preserve arrays and theircontents. This is disabled by default.
``` javascriptvar flatten = require('flat')
flatten({ this: [ { contains: 'arrays' }, { preserving: { them: 'for you' }} ]}, { safe: true})
// {// 'this': [// { contains: 'arrays' },// { preserving: {// them: 'for you'// }}// ]// }```
### object
When enabled, arrays will not be created automatically when calling unflatten, like so:
``` javascriptunflatten({ 'hello.you.0': 'ipsum', 'hello.you.1': 'lorem', 'hello.other.world': 'foo'}, { object: true })
// hello: {// you: {// 0: 'ipsum',// 1: 'lorem',// },// other: { world: 'foo' }// }```
### overwrite
When enabled, existing keys in the unflattened object may be overwritten if they cannot hold a newly encountered nested value:
```javascriptunflatten({ 'TRAVIS': 'true', 'TRAVIS.DIR': '/home/travis/build/kvz/environmental'}, { overwrite: true })
// TRAVIS: {// DIR: '/home/travis/build/kvz/environmental'// }```
Without `overwrite` set to `true`, the `TRAVIS` key would already have been set to a string, thus could not accept the nested `DIR` element.
This only makes sense on ordered arrays, and since we're overwriting data, should be used with care.
### maxDepth
Maximum number of nested objects to flatten.
``` javascriptvar flatten = require('flat')
flatten({ key1: { keyA: 'valueI' }, key2: { keyB: 'valueII' }, key3: { a: { b: { c: 2 } } }}, { maxDepth: 2 })
// {// 'key1.keyA': 'valueI',// 'key2.keyB': 'valueII',// 'key3.a': { b: { c: 2 } }// }```
### transformKey
Transform each part of a flat key before and after flattening.
```javascriptvar flatten = require('flat')var unflatten = require('flat').unflatten
flatten({ key1: { keyA: 'valueI' }, key2: { keyB: 'valueII' }, key3: { a: { b: { c: 2 } } }}, { transformKey: function(key){ return '__' + key + '__'; }})
// {// '__key1__.__keyA__': 'valueI',// '__key2__.__keyB__': 'valueII',// '__key3__.__a__.__b__.__c__': 2// }
unflatten({ '__key1__.__keyA__': 'valueI', '__key2__.__keyB__': 'valueII', '__key3__.__a__.__b__.__c__': 2}, { transformKey: function(key){ return key.substring(2, key.length - 2) }})
// {// key1: {// keyA: 'valueI'// },// key2: {// keyB: 'valueII'// },// key3: { a: { b: { c: 2 } } }// }```
## Command Line Usage
`flat` is also available as a command line tool. You can run it with [`npx`](https://ghub.io/npx):
```shnpx flat foo.json```
Or install the `flat` command globally: ```shnpm i -g flat && flat foo.json```
Accepts a filename as an argument:
```shflat foo.json```
Also accepts JSON on stdin:
```shcat foo.json | flat```
|