json 如何测试数组是否包含项目,而不是它的某个子集

0vvn1miw  于 2023-03-04  发布在  其他
关注(0)|答案(2)|浏览(104)

因此,我似乎爱上了 * 包含 * 函数定义,因为:

yq -n '["hyper"]|contains(["pe"])'

'surprisingly'返回true。我不知道这在什么情况下有用,对functolan世界来说还是新的,但它在文档中清楚地显示为:

jq 'contains(["baz", "bar"])'
Input   ["foobar", "foobaz", "blarp"]
Output  true

那么,如何简单地编写精确匹配的字符串包含在数组包含中呢?

yq -n '["hyper"] as $i | $i - ["pe"] != $i'

?或者正确的解决方案是什么?

xxhby3vn

xxhby3vn1#

请指定您正在使用的yqwhich implementation。由于您在stedolan/jq的手册中引用了contains过滤器的示例,我假设您正在使用kislyuk/yq,它是jq的YAML Package 器。
jq的contains测试它的参数是否部分包含在输入中,因为这是递归的,所以它也会影响数组的字符串项,而不仅仅是周围的数组本身,因为"pe"包含在"hyper"中,所以它的值为true
jq提供了any过滤器来测试在给定的流中是否至少有一个项对于给定的过滤器计算为true.对于该过滤器,您可以使用等于==操作符,它计算为true以获得精确匹配,对于流,如果省略,any将默认为输入数组中的项.

$ yq -n '["hyper"] | any(. == "pe")'
false
$ yq -n '["hyper"] | any(. == "hyper")'
true

为了以防万一,如果你使用另一个实现mikefarah/yq,它提供了一个类似的函数any_c(因为它不是基于jq的,因此(有时)有不同的语法):
一个二个一个一个

vddsk6oq

vddsk6oq2#

假设是一个类似于jq的实现,您可以使用IN(大写)

$ jq -n --arg elem "pe"    '["hyper"] as $list | $elem | IN($list[])'
false

$ jq -n --arg elem "hyper" '["hyper"] as $list | $elem | IN($list[])'
true

IN()的参数是元素的 * 流 *,而不是数组。

相关问题