【问题标题】:Inconsistent behaviour for jq in/1jq in/1 的行为不一致
【发布时间】:2019-05-01 06:59:29
【问题描述】:

jq docs 中的以下示例按预期工作 --

$ echo '[1,2]' | jq 'map(in([0,1]))'
[
  true,
  false
]

但将值转换为字符串失败 -

$ echo '["1", "2"]' | jq 'map(in(["0","1"]))'
jq: error (at <stdin>:1): Cannot check whether array has a string key

为了确保这不是 shell 引用问题,我还尝试了 --

$ echo "[\"1\", \"2\"]" | jq 'map(in(["0","1"]))'
jq: error (at <stdin>:1): Cannot check whether array has a string key

此外,以下 sn-p 也失败了,这可能是由于将 0 转换为布尔值 false -

$ echo '[0,1]' | jq 'map(in([1,2]))'       
[
  true,
  true
]

【问题讨论】:

    标签: arrays jq


    【解决方案1】:

    你误解了in/1 在做什么。它不是测试一个值是否是数组的成员,而是测试该值是否是对象键的成员。因此,对于数组,期望数字(索引)或对象,字符串(键)。它与has/1 完全相同,但输入是交换的。

    $ jq -n '[0,-1,20,9,16,10] | map(in([range(20;30)]))' # 10 item array
    [
      true,
      false,
      false,
      true,
      false,
      false
    ]
    
    $ jq -n '["foo","bar"] | map(in({foo:1,boo:2,bat:3}))'
    [
      true,
      false
    ]
    

    如果您想测试数组中的成员资格,没有内置函数,但您可以自己制作。虽然contains/1 很接近但并不完全,因为它测试字符串是否是子字符串并且不相等。 any/2 可以用来做这个。

    def has_value($value):
        any(.[]; . == $value);
    
    def in_array($arr): # swapped input version
        . as $value | any($arr[]; . == $value);
    

    【讨论】:

    • 我现在明白了。但是,我对 in 应用于数组的方式不太满意。
    • 我同意,我希望它的行为类似于 in 运算符,因为其他语言通常定义它(例如 python 或 SQL),但它更接近于 javascript 的行为。
    • 我也会向其他需要使用 jeff 食谱的人推荐,is_in 是一个不错的名称,而不是 in_array。
    【解决方案2】:

    index/1 是可以最方便地用于检查数组成员的内置函数。尽管它不是严格的布尔值,但 if 和 // 的语义使它使用起来很方便,就好像它是。如果你想要一个严格的布尔测试,那么只需使用成语index(_) != null。

    index/1 值得详细了解,因此请考虑相应地查看 jq 手册和常见问题解答。另请注意,INDEX/1 没有关系。

    【讨论】:

      【解决方案3】:

      实际上inside 似乎可以解决问题(显然是在 v1.5 中添加的)

      jq -n '[123,444,565,344,"333",111,1111,87] | map([.]|inside([111,333,344]))'
      

      产生

      [
        false,
        false,
        false,
        true,
        false,
        true,
        false,
        false
      ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-12
        • 2020-12-24
        • 2015-03-20
        • 1970-01-01
        • 2011-03-19
        相关资源
        最近更新 更多