Skip to content

Commit dc1e2c6

Browse files
committed
Merge pull request #20 from marcbachmann/compose
jsonpointer.compile(pointer) feature
2 parents cabb37d + 781cdd0 commit dc1e2c6

File tree

3 files changed

+44
-11
lines changed

3 files changed

+44
-11
lines changed

README.md

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,24 @@
33
This is an implementation of [JSON Pointer](http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-08).
44

55
## Usage
6-
7-
var jsonpointer = require("jsonpointer");
8-
var obj = { foo: 1, bar: { baz: 2}, qux: [3, 4, 5]};
9-
var one = jsonpointer.get(obj, "/foo");
10-
var two = jsonpointer.get(obj, "/bar/baz");
11-
var three = jsonpointer.get(obj, "/qux/0");
12-
var four = jsonpointer.get(obj, "/qux/1");
13-
var five = jsonpointer.get(obj, "/qux/2");
14-
var notfound = jsonpointer.get(obj, "/quo"); // returns null
15-
16-
jsonpointer.set(obj, "/foo", 6); // obj.foo = 6;
6+
```javascript
7+
var jsonpointer = require('jsonpointer');
8+
var obj = { foo: 1, bar: { baz: 2}, qux: [3, 4, 5]};
9+
10+
jsonpointer.get(obj, '/foo'); // returns 1
11+
jsonpointer.get(obj, '/bar/baz'); // returns 2
12+
jsonpointer.get(obj, '/qux/0'); // returns 3
13+
jsonpointer.get(obj, '/qux/1'); // returns 4
14+
jsonpointer.get(obj, '/qux/2'); // returns 5
15+
jsonpointer.get(obj, '/quo'); // returns null
16+
17+
jsonpointer.set(obj, '/foo', 6); // sets obj.foo = 6;
18+
jsonpointer.set(obj, '/qux/-', 6) // sets obj.qux = [3, 4, 5, 6]
19+
20+
pointer = jsonpointer.compile('/foo')
21+
pointer.get(obj) // returns 1
22+
pointer.set(obj, 1) // sets obj.foo = 1
23+
```
1724

1825
## Testing
1926

jsonpointer.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ var compilePointer = function (pointer) {
6565
if (!(pointer instanceof Array)) {
6666
pointer = pointer.split('/')
6767
if (pointer.shift() !== '') throw new Error('Invalid JSON pointer.')
68+
} else {
69+
// Clone the pointer array
70+
var newPointer = []
71+
for (var i = 0; i < pointer.length; i++) newPointer[i] = pointer[i]
72+
pointer = newPointer
6873
}
6974

7075
return pointer
@@ -94,5 +99,18 @@ var set = function (obj, pointer, value) {
9499
return traverse(obj, pointer, value)
95100
}
96101

102+
var compile = function (pointer) {
103+
var compiled = compilePointer(pointer)
104+
return {
105+
get: function (object) {
106+
return get(object, compiled)
107+
},
108+
set: function (object, value) {
109+
return set(object, compiled, value)
110+
}
111+
}
112+
}
113+
97114
exports.get = get
98115
exports.set = set
116+
exports.compile = compile

test.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,4 +105,12 @@ assert.equal(jsonpointer.get(example, '/k\'l'), 6)
105105
assert.equal(jsonpointer.get(example, '/ '), 7)
106106
assert.equal(jsonpointer.get(example, '/m~0n'), 8)
107107

108+
// jsonpointer.compile(path)
109+
var a = {foo: 'bar'}
110+
var pointer = jsonpointer.compile('/foo')
111+
assert.equal(pointer.get(a), 'bar')
112+
assert.equal(pointer.set(a, 'test'), 'bar')
113+
assert.equal(pointer.get(a), 'test')
114+
assert.deepEqual(a, {foo: 'test'})
115+
108116
console.log('All tests pass.')

0 commit comments

Comments
 (0)