DISCONTINUED in favor of emuto
jq-in-the-browser
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)
Install
npm install --save jq-in-the-browser
Usage
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"
]
}
Comparison with alternatives
jq-web
- 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
- node-jq is great, but it doesn’t work in the browser.
something else?
If you know an alternative, feel free to create a pull request. :-)
Supported features
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] |