【问题标题】:Use a jq range variable to feed into a new jq filter使用 jq 范围变量输入新的 jq 过滤器
【发布时间】:2019-04-26 05:44:41
【问题描述】:

我有一些如下所示的 JSON:

{
    "vertices": [
        {
         "id": 71597,
          "ns": "ca",
          "alias": "polarized"
        },
        {
          "id": 129748,
          "ns": "av",
          "name": "Polarized"
        },
        {
          "id": 129898,
          "ns": "av",
          "name": "False"
        }
    ],
    "edgeGroups": {
        "hasAttributeValue": [
            [
              0,
              1
            ],
            [
              0,
              2
            ]
        ]
    }
}

.vertices 中的各个条目通过它们的数组索引相关联。所以在这种情况下,第一个顶点(id:71597 - 数组索引为 0)具有属性值 129748 和 129898(数组索引分别为 1 和 2)。

我可以使用以下 jq 过滤器获取我正在搜索的属性的数组索引:

.vertices | range(0;length) as $i | select(.[$i].alias=="polarized" and .[$i].ns=="ca") | $i

返回 $i 值为 0,因为别名为“polarized”的对象是数组中的第一项。您可以在 jq play 上尝试一下:

https://jqplay.org/s/DsHYi7ixyn

现在我想在不同的过滤器中使用 $i 值,所以它不是输出 0,而是输出类似于以下结果的内容:

.edgeGroups.hasAttributeValue[] | select(.[0] == 0)

我尝试过像这样使用管道运算符,但它只会给我一个错误:

.vertices | range(0;length) as $i | select(.[$i].alias=="polarized" and .[$i].ns=="ca") | .edgeGroups.hasAttributeValue[] | select(.[0] == $i)

如果我能理解如何在链接过滤器中使用 $i,我想我可以解决我的主要目标,即将几个过滤器链接在一起,以便我可以获得与 71597 对象关联的所有项目 - 即

        {
          "id": 129748,
          "ns": "av",
          "name": "Polarized"
        },
        {
          "id": 129898,
          "ns": "av",
          "name": "False"
        }

提前感谢您的帮助!

【问题讨论】:

  • 对不起,这个问题很不清楚。您展示了结果应该是什么,但 .edgeGroups 方面的解释似乎完全不相关。请说清楚。顺便说一句,如果您专注于数据在您创建的管道中流动的方式,您或许能够解决您的问题。
  • 对不起,我不清楚,但 edgeGroups 中项目的相关方式是相关的。基本上,我想在下一个 jq 过滤器中提供来自第一个过滤器(这是 edgeGroups.hasAttributeValue 中的数组索引)的值 $i:.edgeGroups.hasAttributeValue[] | select(.[0] == i)
  • 这就是我的猜测,正如您将在发布的答案中看到的那样。

标签: variables pipeline jq


【解决方案1】:

你的 jq 过滤器可以用几个括号来固定:

(.vertices
 | range(0;length) as $i
 | select(.[$i].alias=="polarized" and .[$i].ns=="ca")
 | $i) as $i
| .edgeGroups.hasAttributeValue[]
| select(.[0] == $i)

【讨论】:

  • 谢谢!那行得通。而且我能够继续这种模式以使用 ns: av 获取项目的详细信息,这是我的最终目标: (.vertices | range(0;length) as $i | select(.[$i]. alias=="polarized" 和 .[$i].ns=="ca") | $i) as $i | (.edgeGroups.hasAttributeValue[] | select(.[0] == $i)[1]) as $j| .vertices[$j]
猜你喜欢
  • 1970-01-01
  • 2015-08-26
  • 2014-12-31
  • 2018-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
相关资源
最近更新 更多