【问题标题】:How to get the first object after filtering an array in jq?jq中过滤数组后如何获取第一个对象?
【发布时间】:2021-07-29 03:30:59
【问题描述】:

鉴于以下 JSON

{
  "tags": [
    {
      "key": "env",
      "value": "foo"
    },
     {
      "key": "env",
      "value": "bar"
    }
  ]
}

我试图找出键是env 的第一个标签。我有这个-

.tags[] | select (.key=="env") |.[0]

但这给了我一个错误Cannot index object with number

【问题讨论】:

    标签: json select jq


    【解决方案1】:

    使用first(expr) 提供满足您的用例的表达式。

    first(.tags[]? | select(.key == "env") .value)
    

    【讨论】:

      【解决方案2】:

      您可以将查询结果包装在一个数组中,然后选择第一个

      [.tags[] | select(.key=="env")] | .[0]
      

      【讨论】:

      • 有没有更易读/替代的方式?
      【解决方案3】:
      jq -r 'first( .tags[] | select(.key=="env") ).value'
      

      jqplay


      .tags[] 将数组扁平化为值流。您将 .[0] 应用于每个值,而不是过滤后的数组。要过滤数组,您可以使用

      .tags | map(select(...)) | .[0]
      

      .tags | map(select(...)) | first
      

      map(...)[ .[] | ... ]的简写,所以上面等价于

      .tags | [ .[] | select(...) ] | first
      

      [ .tags[] | select(...) ] | first
      

      最后,[ ... ] | first 可以写成first(...)

      first( .tags[] | select(...) )
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-10
        • 1970-01-01
        • 2016-10-08
        • 2019-09-05
        • 2019-11-26
        • 2020-01-27
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多