Search code examples
jsonselectjqany

In jq, how to select objects where an array contains at least one value (intersection non-empty)


I have input like this:

{ "prop": ["apple", "banana"] }
{ "prop": ["kiwi", "banana"] }
{ "prop": ["cherry", "orange"] }

How do I print objects where prop contains at least one of kiwi and orange?

(The list of interesting values is longer than just 2, so I'd like to leverage the any function somehow.)

I've tried the following

jq 'select(any(.prop[] | contains(["kiwi", "orange"])))' < input.json

and various variants of the above, but can't figure out the right expressions.


Solution

  • The stream-oriented version of the built-in function any can be most easily used if one bears in mind its signature:

    def any(generator; condition):
    

    So we are led to:

    select( any( .prop[]; . == "kiwi" or . == "orange" ))
    

    or more succinctly:

    select( any(.prop[]; IN("kiwi", "orange")))
    

    whitelist

    If the values of interest are provided as a JSON array, say $whitelist, you could tweak the above by substituting $whitelist[] for the explicit stream of values:

    select( any(.prop[]; IN($whitelist[]) ))