237 lines
4.1 KiB
Markdown
237 lines
4.1 KiB
Markdown
|
# flat [![Build Status](https://secure.travis-ci.org/hughsk/flat.png?branch=master)](http://travis-ci.org/hughsk/flat)
|
||
|
|
||
|
Take a nested Javascript object and flatten it, or unflatten an object with
|
||
|
delimited keys.
|
||
|
|
||
|
## Installation
|
||
|
|
||
|
``` bash
|
||
|
$ npm install flat
|
||
|
```
|
||
|
|
||
|
## Methods
|
||
|
|
||
|
### flatten(original, options)
|
||
|
|
||
|
Flattens the object - it'll return an object one level deep, regardless of how
|
||
|
nested the original object was:
|
||
|
|
||
|
``` javascript
|
||
|
var 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:
|
||
|
|
||
|
``` javascript
|
||
|
var 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 their
|
||
|
contents. This is disabled by default.
|
||
|
|
||
|
``` javascript
|
||
|
var 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:
|
||
|
|
||
|
``` javascript
|
||
|
unflatten({
|
||
|
'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:
|
||
|
|
||
|
```javascript
|
||
|
unflatten({
|
||
|
'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.
|
||
|
|
||
|
``` javascript
|
||
|
var 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.
|
||
|
|
||
|
```javascript
|
||
|
var 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):
|
||
|
|
||
|
```sh
|
||
|
npx flat foo.json
|
||
|
```
|
||
|
|
||
|
Or install the `flat` command globally:
|
||
|
|
||
|
```sh
|
||
|
npm i -g flat && flat foo.json
|
||
|
```
|
||
|
|
||
|
Accepts a filename as an argument:
|
||
|
|
||
|
```sh
|
||
|
flat foo.json
|
||
|
```
|
||
|
|
||
|
Also accepts JSON on stdin:
|
||
|
|
||
|
```sh
|
||
|
cat foo.json | flat
|
||
|
```
|