From c9b54af9a424e6e6d3e479b1020bc73c942b551f Mon Sep 17 00:00:00 2001 From: Marc Bachmann Date: Wed, 27 May 2015 02:13:17 +0200 Subject: [PATCH 1/2] Add jsonpointer.compile(pointer) support --- jsonpointer.js | 18 ++++++++++++++++++ test.js | 8 ++++++++ 2 files changed, 26 insertions(+) diff --git a/jsonpointer.js b/jsonpointer.js index c0ae809..a7b3338 100644 --- a/jsonpointer.js +++ b/jsonpointer.js @@ -65,6 +65,11 @@ var compilePointer = function (pointer) { if (!(pointer instanceof Array)) { pointer = pointer.split('/') if (pointer.shift() !== '') throw new Error('Invalid JSON pointer.') + } else { + // Clone the pointer array + var newPointer = [] + for (var i = 0; i < pointer.length; i++) newPointer[i] = pointer[i] + pointer = newPointer } return pointer @@ -94,5 +99,18 @@ var set = function (obj, pointer, value) { return traverse(obj, pointer, value) } +var compile = function (pointer) { + var compiled = compilePointer(pointer) + return { + get: function (object) { + return get(object, compiled) + }, + set: function (object, value) { + return set(object, compiled, value) + } + } +} + exports.get = get exports.set = set +exports.compile = compile diff --git a/test.js b/test.js index fc48d54..8e48b46 100644 --- a/test.js +++ b/test.js @@ -105,4 +105,12 @@ assert.equal(jsonpointer.get(example, '/k\'l'), 6) assert.equal(jsonpointer.get(example, '/ '), 7) assert.equal(jsonpointer.get(example, '/m~0n'), 8) +// jsonpointer.compile(path) +var a = {foo: 'bar'} +var pointer = jsonpointer.compile('/foo') +assert.equal(pointer.get(a), 'bar') +assert.equal(pointer.set(a, 'test'), 'bar') +assert.equal(pointer.get(a), 'test') +assert.deepEqual(a, {foo: 'test'}) + console.log('All tests pass.') From 781cdd074162e3d5e892e425e813dc2115c874f8 Mon Sep 17 00:00:00 2001 From: Marc Bachmann Date: Wed, 30 Sep 2015 00:54:38 +0200 Subject: [PATCH 2/2] Add jsonpointer.compile to README --- README.md | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 90c577a..5956c2b 100644 --- a/README.md +++ b/README.md @@ -3,17 +3,24 @@ This is an implementation of [JSON Pointer](http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-08). ## Usage - - var jsonpointer = require("jsonpointer"); - var obj = { foo: 1, bar: { baz: 2}, qux: [3, 4, 5]}; - var one = jsonpointer.get(obj, "/foo"); - var two = jsonpointer.get(obj, "/bar/baz"); - var three = jsonpointer.get(obj, "/qux/0"); - var four = jsonpointer.get(obj, "/qux/1"); - var five = jsonpointer.get(obj, "/qux/2"); - var notfound = jsonpointer.get(obj, "/quo"); // returns null - - jsonpointer.set(obj, "/foo", 6); // obj.foo = 6; +```javascript +var jsonpointer = require('jsonpointer'); +var obj = { foo: 1, bar: { baz: 2}, qux: [3, 4, 5]}; + +jsonpointer.get(obj, '/foo'); // returns 1 +jsonpointer.get(obj, '/bar/baz'); // returns 2 +jsonpointer.get(obj, '/qux/0'); // returns 3 +jsonpointer.get(obj, '/qux/1'); // returns 4 +jsonpointer.get(obj, '/qux/2'); // returns 5 +jsonpointer.get(obj, '/quo'); // returns null + +jsonpointer.set(obj, '/foo', 6); // sets obj.foo = 6; +jsonpointer.set(obj, '/qux/-', 6) // sets obj.qux = [3, 4, 5, 6] + +pointer = jsonpointer.compile('/foo') +pointer.get(obj) // returns 1 +pointer.set(obj, 1) // sets obj.foo = 1 +``` ## Testing