Read and update nested objects using simple patterns.
Find a file
2019-08-29 14:22:42 -07:00
test handle null values along a path 2019-05-28 23:49:48 -07:00
.gitignore Cleanup + more tests 2015-07-10 12:38:48 -07:00
.jsbeautifyrc Cleanup + more tests 2015-07-10 12:38:48 -07:00
.jshintrc Update to ES6 2016-03-01 15:32:43 -08:00
.travis.yml adding travis config file 2013-09-24 17:28:28 +02:00
index.js handle null values along a path 2019-05-28 23:49:48 -07:00
LICENSE init 2013-09-24 17:21:09 +02:00
package-lock.json Bump lodash from 4.17.11 to 4.17.15 2019-08-29 20:11:29 +00:00
package.json handle null values along a path 2019-05-28 23:49:48 -07:00
README.md Better handling of bad paths 2016-06-15 19:10:18 -07:00

Delver

Read and update nested objects using simple patterns.

Examples

get

const Delver = require( 'delver' );

let obj = {
    foo: {
        bar: 'value',
        arr: [ 1, 2, 3 ]
    }
};

let delver = new Delver( obj );

console.log( delver.get( 'foo.bar' ) );
console.log( delver.get( 'foo.bar2', 'default' ) );
console.log( delver.get( 'foo.arr[1]' ) );

// You don't actually need a Delver instance.
console.log( Delver.get( obj, 'foo.bar' ) );
console.log( Delver.get( obj, 'foo.bar2' ) );
console.log( Delver.get( obj, 'foo.arr[1]' ) );

output:

value
default
2
value
undefined
2

set

const Delver = require( 'delver' );

let obj = {};
let delver = new Delver( obj );

delver.set( 'foo.bar', 'value' );
console.log( delver.get( 'foo.bar' ) );

delver.set( 'foo.baz[]', 'value1' );
delver.set( 'foo.baz[]', 'value2' );

// You don't actually need a Delver instance.
Delver.set( obj, 'foo.baz[]', 'value3' );

console.log( delver.get( 'foo.baz' ) );

output:

value
[ 'value1', 'value2', 'value3' ]

Why would I need this?

One example is to allow for more succinct REST requests.

Let's say you have an object of type 'foo' with id '123'. It looks like this:

{
    "name": "bloop",
    "media": {
        "photos": [
            {
                "url": "http://somewhere.com/images/turtle.jpg",
                "preview": "http://somewhere.com/images/turtle-preview.jpg",
                "width": 50,
                "height": 50
            },
            {
                "url": "http://somewhere.com/images/snake.jpg",
                "preview": "http://somewhere.com/images/snake-preview.jpg",
                "width": 50,
                "height": 50
            }
        ]
    }
}

Now, let's say you want to update the width of the snake picture to be 100 instead of 50. Because your server-side setup doesn't allow dot notation access, maybe you need to send back the entire array of photos with the new updated value:

curl http://somewhere.com/foo/123
  -X PUT
  -H 'Content-Type: application/json'
  -H 'Accept: application/json'
  --data-binary '{
    "media": {
        "photos": [
            {
                "url": "http://somewhere.com/images/turtle.jpg",
                "preview": "http://somewhere.com/images/turtle-preview.jpg",
                "width": 50,
                "height": 50
            },
            {
                "url": "http://somewhere.com/images/snake.jpg",
                "preview": "http://somewhere.com/images/snake-preview.jpg",
                "width": 100,
                "height": 50
            }
        ]
    }
  }'

But with Delver on the server, you could send:

curl http://somewhere.com/foo/123
  -X PUT
  -H 'Content-Type: application/json'
  -H 'Accept: application/json'
  --data-binary '{
    "media.photos[1].width": 100
  }'

And then in your node.js server, Delver will let you find the appropriate field in the 'foo' object and update it directly.

Methods

new Delver( object )

Creates a Delver instance with an object to operate on.

.get( key, defaultValue )

Returns the internal object's value at the given key if found, else returns defaultValue.

If called with no arguments, will return the bare internal object.

.set( key, value )

Sets the internal object's value to value at the given key and overrides it if it already exists.

Delver.get( object, key, defaultValue] )

Returns the given object's value at the given key if found, else returns defaultValue.

Delver.set( object, key, value )

Sets the given object's value to value at the given key and overrides it if it already exists.

Install

With npm do:

npm install delver

License

MIT

Credits

Delver is based off a fork of Tim Taubert's node-accessors. Many thanks to him for a great little library.

Delver was created to enable a couple of additional features:

  • array level element access, eg:
    Delver.get( obj, 'foo.bar[3]' ); // get element with index 3 of array 'bar'
    Delver.set( obj, 'foo.bar[4].baz', 'yak' ); // set field 'baz' of element with index 4 of array 'bar'
  • allow for a less strict traversal of objects
    • specifically, I needed to support mongoose objects which have accessors instead of hasOwnProperty()-checkable members
  • add ability to enable/disable automatic path creation