# Flatten Object
> Flatten an object.
## Usage
```javascript
var flattenObject = require( '@stdlib/utils/flatten-object' );
```
#### flattenObject( obj\[, options] )
Flattens an `object`.
```javascript
var obj = {
'a': {
'b': {
'c': 'd'
}
}
};
var out = flattenObject( obj );
// returns { 'a.b.c': 'd' }
```
The function accepts the following `options`:
- **depth**: maximum depth to flatten.
- **copy**: `boolean` indicating whether to deep [copy][@stdlib/utils/copy] property values. Default: `false`.
- **delimiter**: key path delimiter. Default: `'.'`.
- **flattenArrays**: `boolean` indicating whether to flatten `arrays`. Default: `false`.
To flatten to a specified depth, set the `depth` option.
```javascript
var obj = {
'a': {
'b': {
'c': 'd'
}
}
};
var out = flattenObject( obj, {
'depth': 1
});
// returns { 'a.b': {'c': 'd'} }
var bool = ( obj.a.b === out['a.b'] );
// returns true
```
To deep [copy][@stdlib/utils/copy] property values, set the `copy` option to `true`.
```javascript
var obj = {
'a': {
'b': {
'c': 'd'
}
}
};
var out = flattenObject( obj, {
'depth': 1,
'copy': true
});
// returns { 'a.b': { 'c': 'd' } }
var bool = ( obj.a.b === out['a.b'] );
// returns false
```
To specify a custom key path delimiter, set the `delimiter` option.
```javascript
var obj = {
'a': {
'b': {
'c': 'd'
}
}
};
var out = flattenObject( obj, {
'delimiter': '-|-'
});
// returns { 'a-|-b-|-c': 'd' }
```
By default, the function does **not** flatten `arrays`. To flatten `arrays`, set the `flattenArrays` option to `true`.
```javascript
var obj = {
'a': {
'b': [ 1, 2, 3 ]
}
};
var out = flattenObject( obj, {
'flattenArrays': true
});
// returns { 'a.b.0': 1, 'a.b.1': 2, 'a.b.2': 3 }
```
#### flattenObject.factory( options )
Returns a `function` to flatten an `object`.
```javascript
var flatten = flattenObject.factory({
'delimiter': '|',
'flattenArrays': true
});
var obj = {
'a': {
'b': {
'c': 'd'
}
}
};
var out = flatten( obj );
// returns { 'a|b|c': 'd' }
obj = {
'a': {
'b': [ 1, 2, 3 ]
}
};
out = flatten( obj );
// returns { 'a|b|0': 1, 'a|b|1': 2, 'a|b|2': 3 }
```
The function accepts the same `options` as [`flattenObject()`](#flatten-object).
## Examples
```javascript
var Float64Array = require( '@stdlib/array/float64' );
var string2buffer = require( '@stdlib/buffer/from-string' );
var flattenObject = require( '@stdlib/utils/flatten-object' );
function noop() {
// Do nothing...
}
var obj = {
'a': {
'b': {
'beep': 'boop',
'foo': 'bar'
},
'c': [ 1, 2, 3 ],
'd': true,
'e': null,
'f': 3.14,
'g': new Date(),
'h': {
'bip': 6,
'bop': [ 4, 5, 6 ]
},
'i': [ null, true, {} ],
'j': /.*/,
'k': noop,
'l': NaN,
'm': [],
'n': string2buffer( 'hello' ),
'o': {
'data': new Float64Array( 10 )
},
'p': {
'1': {
'2': {
'3': {}
}
}
}
}
};
var out = flattenObject( obj, {
'depth': 5,
'copy': true,
'flattenArrays': false,
'delimiter': '-|-'
});
/* returns
{
'a-|-b-|-beep': 'boop',
'a-|-b-|-foo': 'bar',
'a-|-c': [1,2,3],
'a-|-d': true,
'a-|-e': null,
'a-|-f': 3.14,
'a-|-g': ,
'a-|-h-|-bip': 6,
'a-|-h-|-bop': [4,5,6],
'a-|-i': [null,true,{}],
'a-|-j': ,
'a-|-k': ,
'a-|-l': NaN,
'a-|-m': [],
'a-|-n': ,
'a-|-o-|-data': ,
'a-|-p-|-1-|-2-|-3': {}
}
*/
```
[@stdlib/utils/copy]: https://www.npmjs.com/package/@stdlib/utils/tree/main/copy