从数组内的子字段中选择值

Jim*_*Jim 1 jq

我有一个看起来像这样的 JSON 对象:

{
    "a": [{
        "name": "x",
        "group": [{
            "name": "tom",
            "publish": true
        },{
            "name": "joe",
            "publish": true
        }]
    }, {
        "name": "y",
        "group": [{
            "name": "tom",
            "publish": false
        },{
            "name": "joe",
            "publish": true
        }]
    }]
}
Run Code Online (Sandbox Code Playgroud)

我想选择其中的所有条目publish=true并创建一个简化的 JSON 对象数组,如下所示:

[
  {
    "name": "x"
    "groupName": "tom"
  },
  {
    "name": "x"
    "groupName": "joe"
  },
  {
    "name": "y"
    "groupName": "joe"
  }  
]
Run Code Online (Sandbox Code Playgroud)

我尝试了很多组合,但是 group 是一个数组的事实似乎阻止了每个组合的工作。在这种特定情况下以及一般情况下,您如何在不丢失完整层次结构的情况下进行深度选择?

hek*_*mgl 5

你可以使用这个:

jq '.[]|map(
      .name as $n
      | .group[]
      | select(.publish==true)
      | {name:$n,groupname:.name}
    )' file.json
Run Code Online (Sandbox Code Playgroud)


Cha*_*ffy 5

Using<expression> as $varname允许您在深入层次结构之前将值存储在变量中。

jq -n '
[inputs[][]
 | .name as $group
 | .group[]
 | select(.publish == true)
 | {name, groupName: $group}
]' <input.json
Run Code Online (Sandbox Code Playgroud)