flatten-obj
v3.1.1
Published
Converts an object literal with deeply nested nodes to a simple key/value object
Downloads
5,126
Maintainers
Readme
flatten-obj
Converts an object literal with deeply nested nodes to a simple key/value object. In other words converts this:
{
foo: 1,
bar: {
sub1: 2,
sub2: {
sub3: 3
}
}
}
To this:
{
foo: 1,
'bar.sub1': 2,
'bar.sub2.sub3': 3
}
Installation
npm install flatten-obj
Usage
var flatten = require('flatten-obj')()
var obj = {
foo: {
bar: 1
}
}
// outputs `{ 'foo.bar': 1 }`
console.log(flatten(obj))
Blacklist
Some objects migth seem like object literals, but shouldn't be flattened. To avoid this, you can supply a list of classes that shouldn't be flattened when the object is traversed:
var Klass = function () {
this.baz = 1
}
var flatten = require('flatten-obj')({ blacklist: [Klass] })
var obj = {
foo: {
bar: new Klass()
}
}
// outputs `{ 'foo.bar': { baz: 1 } }`
console.log(flatten(obj))
Custom separator
You can use a custom separator character to join keys:
var flatten = require('flatten-obj')({ separator: '/' })
var obj = {
foo: {
bar: 42
}
}
// outputs `{ 'foo/bar': 42 }`
console.log(flatten(obj))
Leaves
Only return the leaf nodes
var flatten = require('flatten-obj')({ onlyLeaves: true })
var obj = {
sub: {
foo: 1,
bar: {
baz: 2
}
}
}
// outputs `{ foo: 1, baz: 2 }`
console.log(flatten(obj))
Gotchas
MongoDB data types
MongoDB data types like ObjectId
or Timestamp
looks like regular
object literals and should be handled with care. So you would normally
want to add those to the blacklist:
var mongodb = require('mongodb')
var flatten = require('flatten-obj')({ blacklist: [
mongodb.ObjectID,
mongodb.DBRef,
mongodb.Timestamp,
mongodb.MinKey,
mongodb.MaxKey,
mongodb.Long
]})
Arrays
This module currenly leaves arrays and their content in place. I.e. the
keys foo
and bar
in the following object isn't modified:
{
foo: [1, 2, 3],
bar: [{ foo: 1 }, { bar: 2 }]
}
If you are familiar with MongoDB you know though that it's possible to update single elements of an array using the dot-notation-syntax.
Open a pull request or tell me about your use case if you'd like the above object to be converted to:
{
foo: [1, 2, 3],
'bar.0.foo': 1,
'bar.1.bar': 2
}
License
MIT