使用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