JQ从具有以字符串结尾的字段的数组中获取对象

JQ get objects from array that has a field ending in string

我正在尝试做我认为应该是一个相当简单的过滤器,但我一直 运行 出错。我有这个 JSON:

{
  "versions": [
    {
      "archived": true,
      "description": "Cod version 3.3/Sprint 8",
      "id": "11500",
      "name": "v 3.3",
      "projectId": 11500,
      "releaseDate": "2016-03-15",
      "released": true,
      "self": "https://xxxxxxx.atlassian.net/rest/api/2/version/11500",
      "startDate": "2016-02-17",
      "userReleaseDate": "14/Mar/16",
      "userStartDate": "16/Feb/16"
    },
    {
      "archived": true,
      "description": "Hot fix",
      "id": "12000",
      "name": "v3.3.1",
      "projectId": 11500,
      "releaseDate": "2016-03-15",
      "released": true,
      "self": "https://xxxxxxx.atlassian.net/rest/api/2/version/12000",
      "startDate": "2016-03-15",
      "userReleaseDate": "14/Mar/16",
      "userStartDate": "14/Mar/16"
    },
    {
      "archived": false,
      "id": "29704",
      "name": "Sync-diff v1.0.0",
      "projectId": 11500,
      "releaseDate": "2022-02-16",
      "released": true,
      "self": "https://xxxxxxx.atlassian.net/rest/api/2/version/29704",
      "startDate": "2022-02-06",
      "userReleaseDate": "15/Feb/22",
      "userStartDate": "05/Feb/22"
    }
  ]
}

我只想return任何以'22'结尾的userReleaseDate

我可以通过以下方式获得布尔结果:

jq '.versions[].userReleaseDate | endswith("22")' 

打印出假、假、真

但我不确定如何检索对象。我试过这个的变体:

[.versions[] as $keys |  $keys select(endswith("22"))]

并且每个都抛出一个错误。任何帮助将不胜感激。

直接在对象列表上使用select,提取并检查其参数中的发布日期:

jq '.versions[] | select(.userReleaseDate | endswith("22"))'

这太接近了:

jq '.versions[].userReleaseDate | endswith("22")'

而不是输出它们是否以22结尾,你想要select值以 22 结尾。固定:

jq '.versions[].userReleaseDate | select( endswith("22") )'

现在,您的问题要求以 22 结尾的日期,但标题表明您想要 objects。为此,您需要一些不同的东西。我们希望 select 来自版本,而不是日期。

jq '.versions[] | select( .userReleaseDate | endswith("22") )'       # As a stream
jq '[ .versions[] | select( .userReleaseDate | endswith("22") ) ]'   # As an array
jq '.versions | map( select( .userReleaseDate | endswith("22") ) )'  # As an array

[ .versions[] as $keys | $keys select(endswith("22")) ] 存在一些问题。

  • 数组元素的键通常不叫keys,而是indexes$indexes 会是一个更好的名字。

  • Except .versions[] 获取数组元素的 values,而不是 keys/索引$values 会是一个更好的名字。

  • 除了变量一次只取一个值。 $value 会是一个更好的名字。

  • $version 会是一个更好的名字。

  • $keysselect(endswith("22")) 之间少了一个 |

  • 任何地方都没有提到 userReleaseDate

  • 结果放在一个数组中(因为[ ])。没有必要也没有这个愿望。

你可以使用

.versions[] as $version | $version.userReleaseDate | select(endswith("22"))

.versions[].userReleaseDate as $date | $date | select(endswith("22"))

但这只是

的overly-complicated个版本
jq '.versions[].userReleaseDate | select( endswith("22") )'