237 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			237 lines
		
	
	
		
			4.1 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
# flat [](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
 | 
						|
```
 |