使用 jq 范围变量输入新的 jq 过滤器

Use a jq range variable to feed into a new jq filter

我有一些 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

returns $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"
        }

提前感谢您的帮助!

您的 jq 过滤器可以用几个括号修复:

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