jq:将查找键作为字段包含在结果值中

jq: Include the lookup key as a field in the result value

我有一个以下形式的 JSON 对象:

{
  "vars": {
    "node1": {"field1": "a", "field2": "b"},
    "node2": {"field1": "x", "field2": "y"}
    "unrelated": {"blah": "blah"}
  },
  "nodes": ["node1", "node2"]
}

现在,我可以使用以下 jq 表达式获取每个节点的字段(不包括 unrelated):

.vars[.nodes[]]

输出:

{
  "field1": "a",
  "field2": "b"
}
{
  "field1": "x",
  "field2": "y"
}

我的问题是,如何将 vars 键作为字段包含在输出中,即

{
  "node": "node1",
  "field1": "a",
  "field2": "b"
}
{
  "node": "node2",
  "field1": "x",
  "field2": "y"
}

密钥的名称(示例中的node)并不重要。

基于this post我找到了一个近似解:

.vars | to_entries | map_values(.value + {node: .key})[]

输出

{
  "field1": "a",
  "field2": "b",
  "node": "node1"
}
{
  "field1": "x",
  "field2": "y",
  "node": "node2"
}
{
  "blah": "blah",
  "node": "unrelated"
}

但它仍然包含不应该包含的无关字段。

nodes 数组的元素存储在变量中以供参考。自动存储元素而不是整个数组也会为下一步进行迭代。然后,只需使用 nodes 数组项作为对象 {$node} 添加到 .vars[$node].

中的 looked-up 对象来组成您想要的输出对象
jq '.nodes[] as $node | {$node} + .vars[$node]'
{
  "node": "node1",
  "field1": "a",
  "field2": "b"
}
{
  "node": "node2",
  "field1": "x",
  "field2": "y"
}

Demo