使用SELECT的白名单对象

我正在尝试使用 contains 功能,由JQ提供。 我的输入,

[1, 2, 3, 4, 5]

我有一个 “白名单”:

[3, 4, 7]

我需要通过白名单过滤输入列表。 预期输出:

[3, 4]

我可以过滤比较单个项目:

jq --compact-output --null-input '[1,2,3,4,5] | map(select(. | contains(3)))'[3]

我尝试了:

$ jq --compact-output --null-input '[1,2,3,4,5] | map(select([3,4,7] | contains([.])))'[]$

这里 [3,4,7] | contains([.]) 提出问题的意图:

是 [.] 列表的冠军 [3,4,7]?

但这行不通。我想念什么?

如何使用白名单过滤?

看答案

您要使用的过滤器 contains 是:

map(. as $x | select([3,4,7] | contains([$x])))

您的尝试使用。错误。

使用索引/1

对于这种类型的问题,最好使用 index/1 比 contains 或它的逆向 inside。原因是语义和效率考虑因素。

如果白名单作为$白名单,并且要使用地图(选择(…)),则适当的过滤器将是:

map( . as $x | select($whitelist|index($x)))

对于长数组,这当然非常效率低下。对于此类数组,您几乎肯定想查看替代方案,例如使用 bsearch (二进制搜索)或JSON对象(哈希)。

Def IX:

当前的实施 index/1 对于目前目的而言并不理想,但它很快,因为它是用C编写的。这是一个假定可用性的替代定义 any/2:

def ix(x): any(.[]; .==x);

本文链接:https://xdcnz.com/10639.html