diff --git a/builtin.c b/builtin.c index dbf6608c..2ccfb78b 100644 --- a/builtin.c +++ b/builtin.c @@ -1121,6 +1121,8 @@ static const char* const jq_builtins[] = { " | reduce range(0; $max) as $j" " ([]; . + [reduce range(0;$length) as $i ([]; . + [ $in[$i][$j] ] )] )" " end;", + "def in(xs): . as $x | xs | has($x)", + "def inside(xs): . as $x | xs | contains($x)", }; #undef LIBM_DD diff --git a/docs/content/3.manual/manual.yml b/docs/content/3.manual/manual.yml index cd2b34e5..8087d8b6 100644 --- a/docs/content/3.manual/manual.yml +++ b/docs/content/3.manual/manual.yml @@ -653,6 +653,22 @@ sections: input: '[[0,1], ["a","b","c"]]' output: ['[false, true]'] + - title: `in` + body: | + + The builtin function `in` returns the input key is in the + given object, or the input index corresponds to an element + in the given array. It is, essentially, an inversed version + of `has`. + + examples: + - program: 'in({"foo": 42})' + input: '"foo", "bar"' + output: ['true', 'false'] + - program: 'map(in([0,1]))' + input: '[2, 0]' + output: ['false', 'true'] + - title: "`path(path_expression)`" body: | @@ -1175,6 +1191,30 @@ sections: input: '"a,b, cd, efg, hijk"' output: ['12'] + - title: `inside` + body: | + + The filter `inside(b)` will produce true if the input is + completely contained within b. It is, essentially, an + inversed version of `contains`. + + examples: + - program: 'inside("foobar")' + input: '"bar"' + output: ['true'] + - program: 'inside(["foobar", "foobaz", "blarp"])' + input: '["baz", "bar"]' + output: ['true'] + - program: 'inside(["foobar", "foobaz", "blarp"])' + input: '["bazzzzz", "bar"]' + output: ['false'] + - program: 'inside({"foo": 12, "bar":[1,2,{"barp":12, "blip":13}]})' + input: '{foo: 12, bar: [{barp: 12}]}' + output: ['true'] + - program: 'inside({"foo": 12, "bar":[1,2,{"barp":12, "blip":13}]})' + input: '{foo: 12, bar: [{barp: 15}]}' + output: ['false'] + - title: "`startswith(str)`" body: |