【问题标题】:How to filter array of objects by element property values and select the first element, using jq?如何使用 jq 按元素属性值过滤对象数组并选择第一个元素?
【发布时间】:2021-01-31 18:46:55
【问题描述】:

我正在尝试通过对象的name 属性过滤对象数组,然后选择通过过滤器的第一个元素。

我已阅读 How to filter array of objects by element property values using jq? 并且在过去 2 小时内一直在尝试 jq 和 https://jqplay.org/,但我不明白。

整个事情是在 github 操作中执行的 bash 脚本。

ALL_ZEIT_DEPLOYMENTS 在哪里:

{
    "deployments":[
        {
            "uid":"dpl_95kYvsWHaq3yAuJJ6uAaWXQY287R",
            "name":"nrn-v2-mst-aptd-gcms-lcz-sty-c1",
            "url":"nrn-v2-mst-aptd-gcms-lcz-sty-c1-n9ru06e1q.vercel.app"
        },
        {
            "uid":"dpl_Fwk5UXLJFU1miLnSfoUM91gnqSNK",
            "name":"nrn-v2-mst-aptd-gcms-lcz-sty-c2",
            "url":"nrn-v2-mst-aptd-gcms-lcz-sty-c2-hpbca7bei.vercel.app"
        },
        {
            "uid":"dpl_5U9vDaGKWBkSJF1H1EYMzreWeYvu",
            "name":"nrn-v2-mst-aptd-gcms-lcz-sty-c1",
            "url":"nrn-v2-mst-aptd-gcms-lcz-sty-c1-16g58d4zd.vercel.app"
        }
    ]
}

而 bash 脚本是:

  # Filter deployments by their "name" property in order to consider only deployments related to the current project
  ZEIT_LATEST_DEPLOYMENT_FOR_CURRENT_PROJECT=`echo $ALL_ZEIT_DEPLOYMENTS | jq '.deployments[] | select(.name == "$VERCEL_PROJECT_NAME")  | .url'`
  echo "Latest Vercel deployment for current project: " $ZEIT_LATEST_DEPLOYMENT_FOR_CURRENT_PROJECT

  # Extract the first element (which is the latest vercel deployment), and strip the double quotes from its value
  ZEIT_LATEST_DEPLOYMENT_DOMAIN_FOR_CURRENT_PROJECT=`echo $ZEIT_LATEST_DEPLOYMENT_FOR_CURRENT_PROJECT | jq --raw-output '[].url'`
  echo "Latest Vercel deployment domain url for current project: " $ZEIT_LATEST_DEPLOYMENT_DOMAIN_FOR_CURRENT_PROJECT

https://jqplay.org/ 执行以下jq 过滤器.deployments[] | select(.name == "nrn-v2-mst-aptd-gcms-lcz-sty-c1") | .url,我得到了一个“列表”的网址。

但是,我不明白如何提取它的第一个元素,它不是数组,即使我尝试将其转换为带有 .deployments[] | select(.name == "nrn-v2-mst-aptd-gcms-lcz-sty-c1") | [.url] | .[0] 的数组,我仍然得到相同的结果。

我错过了什么?

我的目标是让它在 Github Actions 中运行。

我正在使用网络编辑器预先进行测试。另外,我想将处理的不同部分拆分为不同的变量,以便将它们打印在 Github Actions 日志中,因为它有助于更​​快地调试。 (例如:过滤数组,然后选择第一个元素)


解决方案:

first(.deployments[] | select(.name == "nrn-v2-mst-aptd-gcms-lcz-sty-c1") | .url)

【问题讨论】:

    标签: json select stream jq github-actions


    【解决方案1】:

    我得到一个 url 的“列表”。

    该“列表”实际上是 JSON 值的,因此您可以简单地将 jq 表达式包含在 first( ) 中以获得第一个值。详情请参阅 jq 手册。

    另一种可能性是使用map,而不是使用[] 逐项列出数组,但如上所述使用first 会更有效。

    【讨论】:

    • 感谢您澄清streams,我不知道。关于first,我试了很多次都没有成功。 .deployments[] | select(.name == "nrn-v2-mst-aptd-gcms-lcz-sty-c1") | first(.url) 产生与 .deployments[] | select(.name == "nrn-v2-mst-aptd-gcms-lcz-sty-c1") | .url.deployments[] | first(select(.name == "nrn-v2-mst-aptd-gcms-lcz-sty-c1")) | .url 相同的结果
    • 你能提供一个完整的例子吗?
    • 将“first”包裹在整个 jq 表达式周围。见stedolan.github.io/jq/manual/#Advancedfeatures
    • 我知道我遗漏了一些明显的东西。谢谢你。我已经更新了问题并添加了解决方案。
    猜你喜欢
    • 2016-11-02
    • 2014-12-18
    • 1970-01-01
    • 2020-12-23
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多