在 jq 中,如何 select 数组包含至少一个值的对象(交集非空)

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

我有这样的输入:

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

如何打印 prop 至少包含奇异果和橙子其中之一的对象?

(有趣的值列表不止 2 个,所以我想以某种方式利用 any 函数。)

我尝试了以下方法

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

以及上述的各种变体,但无法找出正确的表达方式。

我认为您正在寻找 IN/2. It's implemented using any,但更容易掌握。

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

Online demo

内置函数 any 的面向流的版本可以最容易地使用,如果记住它的签名:

def any(generator; condition):

所以我们被引导到:

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

或更简洁:

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

白名单

如果感兴趣的值作为 JSON 数组提供,例如 $whitelist,您可以通过用 $whitelist[] 替换显式值流来调整上述内容:

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