DISCONTINUED in favor of emuto
jq-in-the-browser is a JavaScript port of jq. Try it online
Instead of processing serialized data, jq-in-the-browser processes JavaScript objects. It is written from scratch and is relatively small. (~33 kB, ~6.1 kB gzipped)
npm install --save jq-in-the-browser
import jq from 'jq-in-the-browser'
const query = jq('{"names": [.[] | .name]}')
query([
{"name": "Mary", "age": 22},
{"name": "Rupert", "age": 29},
{"name": "Jane", "age": 11},
{"name": "John", "age": 42}
])Output:
{
"names": [
"Mary",
"Rupert",
"Jane",
"John"
]
}- jq-web is an emcripten port of jq, thus it implements all of its features
- ... but it's also too big for many purposes (in the megabytes)
- jq-in-the-browser is written from scratch, but is more limited in features
- ... and also much much smaller :-)
- node-jq is great, but it doesn't work in the browser.
If you know an alternative, feel free to create a pull request. :-)
| Feature | Example |
|---|---|
| Identity | ., . |
| Array Index | .[0], .[1 ], .[-1], .[ 1][0], .[1][1].x, .[1][1].x[0], .[ -1 ] |
| Object Identifier-Index | .foo, .bar, .bar.x, .foo[1] |
| Generic Object Index | .["foo"], .["bar"].x, .bar[ "y"], .["2bar"], .["a b" ] |
| Pipe | .a | .b, .a|.b |
| Parentheses | ( .a), ((.a)), (-1 ), (-5.5), (.4), (. | .) |
| Addition (numbers) | 1 + 1, .a + [.b][0], .b + .a, 3 + 4.1 + .a, 3 + (-3) |
| Subtraction (numbers) | .a - .b, .b - .a, 4- 3, -3 -(4) |
| Multiplication (numbers) | 1 * 1, .a * [.b][0], .b * .a, 3 * 4.1 * .a, 3 * (-.3) |
| Modulo (numbers) | 1 % 1, .a % [.b][0], .b % .a, 3 % 4 % .a |
| Division (numbers) | .a / .b, .b / .a, 4/ 3, -3/(4), -1.1 + (3 * (((.4 - .b) / .a) + .b)) |
| Array Construction | [], [ ], [4], [ -6, [0]], [7 | 4], [.], [. | [6]], [5, 6] | . |
| Object Construction | {}, { }, {"foo": 6}, {"foo": 6, "bar": [5, 3]}, {"x": 3} | {"y": .x}, {foo: "bar"}, {({"a": "b"} | .a): true}, {"a": 4, "b": 3, "c": -1, "d": "f"} |
| Integer literal | 3, 6, -4, 0, 8 |
| Float literal | .3, 6.0, -4.001, 3.14, 0.1 |
| Boolean literal | true, false |
| Double quote String literal | "true", "false", "foo", ["ba'r"] |
| length | [] | length, length |
| keys | keys |
| keys_unsorted | keys_unsorted |
| to_entries | . | to_entries |
| from_entries | . | from_entries |
| reverse | . | reverse |
| map | map(.+1 ), . | map( {foo: .}) |
| map_values | map_values(.+1 ), . | map_values( {foo: .}) |
| with_entries | with_entries({key: .key, value: (2 * .value)}), with_entries({key: "a", value: (2 * .value)}) |
| tonumber | tonumber |
| tostring | tostring |
| sort | sort, [4, 5, 6] | sort |
| sort_by | sort_by(-.), sort_by(1 + .), sort_by(1) |
| join | join(", "), join(""), join(.[0]) |
| Additive inverse | -(1 + 3), -(-1), .a | -(.b), [--1] |
| Array Construction | [], [4] |
| Array/Object Value Iterator | .[], .[ ] |
| Array/Object Value Iterator 2 | .["foo"][], .foo[] |
| Pipe | .[] | ., .[] | .name |
| Stream as object value | {names: .[] | .name}, {"names": .[] | .name, "ages": .[] | .age}, {"names": .[] | .name, "x": 3}, {"names": 5.4, "x": .[] | .age}, {names: 5.4, ages: .[] | .age, ages2: .[] | .id} |
| Array/String slice | .[2:4], .[0:1] |