object-flatten
Version:
Flatten a nested object based on a predicate function
148 lines (106 loc) • 3.75 kB
Markdown
[![Build Status][travis-image]][travis-url]
[![Dependency Status][david-image]][david-url]
[![License][license-image]][license-url]
[![Test coverage][coveralls-image]][coveralls-url]
[![Js Standard Style][standard-image]][standard-url]
Flatten a nested object based on a predicate function. The keys are rewritten to `path.to.nested.object`.
```bash
$ npm install --save object-flatten
```
See [test/index.js](./test/index.js) for full examples.
```js
import flatten, { isLast } from 'object-flatten'
const flattened = flatten(isLast, {
margin: {
auto: { marginLeft: 'auto', marginRight: 'auto' }
}
})
```
This returns you a flattened object:
```js
{
'margin.auto': { marginLeft: 'auto', marginRight: 'auto' }
}
```
[](https://www.npmjs.com/package/object-flatten)
**Default export** Returns a flattened object.
- `predicate` A function which decides when to stop flattening. It is invoked on each property in the object with the signature `property => true|false`.
Predicate function which flattens until the deepest object.
```js
flatten(isLast, some: { very: { deep: { prop: true } } })
// { 'some.very.deep: { prop: true } }
```
#### `isNotObject`
Predicate function which flattens as deep as possible.
```js
flatten(isNotObject, some: { very: { deep: { prop: true } } })
// { 'some.very.deep.prop': true } }
```
## Advanced Use Case
The main use case I had in mind, is together with [unistyle](https://github.com/joakimbeng/unistyle). Let's say we have a `positions.js` module which contains:
```js
export default {
relative: { position: 'relative' },
absolute: { position: 'absolute' },
fixed: { position: 'fixed' },
top0: { top: 0 },
bottom0: { bottom: 0 },
left0: { left: 0 },
right0: { right: 0 },
zindex: [
new Error('index should be between 1 and 4'),
{ zIndex: 1 },
{ zIndex: 2 },
{ zIndex: 3 },
{ zIndex: 4 }
]
}
```
Then you can use this with your preferred virtual dom library and [cngen](https://www.npmjs.com/package/cngen):
```js
import { margin } from './style/white-space'
const Container = ({ size, children }) => {
return (
<div class={cngen(margin.auto)}>
{children}
</div>
)
}
```
The problem comes in when you want to generate your css with this sort of structure. What you have to do is to flatten the object manually:
```js
export default classnameify({
...positions,
...positions.zindex
})
```
Now imagine that this structure can be even more deep and the manual flattening becomes unmaintainable. This is where `object-flatten` helps:
```js
export default {
...flattenObject(isLast, positions)
}
```
```bash
$ npm test
```
[][license-url]
[]: https://img.shields.io/npm/v/object-flatten.svg?style=flat-square
[]: https://npmjs.org/package/object-flatten
[]: http://img.shields.io/david/queckezz/object-flatten.svg?style=flat-square
[]: https://david-dm.org/queckezz/object-flatten
[]: http://img.shields.io/npm/l/object-flatten.svg?style=flat-square
[]: ./license
[]: https://img.shields.io/travis/queckezz/object-flatten.svg?style=flat-square
[]: https://travis-ci.org/queckezz/object-flatten
[]: https://img.shields.io/coveralls/queckezz/object-flatten/master.svg?style=flat-square
[]: https://coveralls.io/r/queckezz/object-flatten?branch=master
[]: https://img.shields.io/badge/code-standard-brightgreen.svg?style=flat-square
[]: https://github.com/feross/standard