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}npm install flatten-obj
varflatten=require('flatten-obj')()varobj={foo: {bar: 1}}// outputs `{ 'foo.bar': 1 }`console.log(flatten(obj))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:
varKlass=function(){this.baz=1}varflatten=require('flatten-obj')({blacklist: [Klass]})varobj={foo: {bar: newKlass()}}// outputs `{ 'foo.bar': { baz: 1 }}`console.log(flatten(obj))You can use a custom separator character to join keys:
varflatten=require('flatten-obj')({separator: '/'})varobj={foo: {bar: 42}}// outputs `{ 'foo/bar': 42 }`console.log(flatten(obj))Only return the leaf nodes
varflatten=require('flatten-obj')({onlyLeaves: true})varobj={sub: {foo: 1,bar: {baz: 2}}}// outputs `{ foo: 1, baz: 2 }`console.log(flatten(obj))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:
varmongodb=require('mongodb')varflatten=require('flatten-obj')({blacklist: [mongodb.ObjectID,mongodb.DBRef,mongodb.Timestamp,mongodb.MinKey,mongodb.MaxKey,mongodb.Long]})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}MIT