Read and update nested objects using simple patterns.
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
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' ]
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.
Creates a Delver instance with an object to operate on.
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.
Sets the internal object's value to value
at the given key
and overrides it if it already exists.
Returns the given object
's value at the given key
if found, else returns defaultValue
.
Sets the given object
's value to value
at the given key
and overrides it if it already exists.
With npm do:
npm install delver
MIT
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