我正在尝试使用jq提供的contains函数来过滤列表。我的意见,
[1,2,3,4,5]我有一个“白名单”:
[3,4,7]我需要通过白名单过滤输入列表。预期产量:
[…
您使用的过滤器 contains 是:
contains
map(. as $x | select([3,4,7] | contains([$x])))
你的尝试使用。不正确。
对于这类问题,最好使用它 index/1 比 contains 或者它的反面, inside 。原因源于语义和效率方面的考虑。
index/1
inside
如果白名单可用作白名单,并且您想使用地图(选择(...)),则适当的过滤器将是:
map( . as $x | select($whitelist|index($x)))
对于长阵列,这当然是非常低效的。对于这样的阵列,您几乎肯定想要查看替代方案,例如使用 bsearch (二分搜索)。
bsearch
目前的实施 index/1 对于目前的目的而言,它不太理想,但它很快,因为它是用C语言编写的。这是一个替代定义,假设可用性 any/2 :
any/2
def ix(x): any(.[]; .==x);
变 contains 对于 inside 它似乎现在有效:
$ jq --compact-output --null-input '[1,2,3,4,5] | map(select([.] | inside([3,4,7])))' [3,4] $