22

给定一个对象列表,其中包含许多我不想要的键:

[{
    "name": "Alice",
    "group": "Admins",
    "created": "2014"
}, {
    "name": "Bob",
    "group": "Users",
    "created": "2014"
}]

如何过滤这些对象以仅包含我想要的键?

[{
    "name": "Alice"
}, {
    "name": "Bob"
}]

我已经尝试过jq '.[].name',但这会提取值,而不是保留对象。

4

5 回答 5

29

您可以使用该map()功能过滤任何键:

jq 'map({name: .name})'

更新

建议@WilfredHughes:上述过滤器可简写如下:

jq 'map({name})'
于 2015-01-08T11:19:16.350 回答
19

如果您知道不需要的键,则可以使用mapwith :del

jq 'map(del (.group) | del (.created))'
于 2015-01-08T11:23:56.677 回答
4

map没有该功能的另一种解决方案:

jq '[.[] | {name: .name}]'
于 2016-06-10T15:37:54.607 回答
4

接受的答案(带有map)和@mauricio-tranjano 的等效答案实际上会将指定的密钥添加到尚未拥有它的对象中。如果这不是您想要的行为,请考虑使用has(_),例如:

$ jq -c 'map( if has("a") then {a} else {} end )'

输入:

[{id:1,a:1}, {id:2}]

输出:

[{"a":1},{}]
于 2017-01-29T14:10:22.333 回答
0

这将允许保留一组字段(由正则表达式匹配)。

map(
  to_entries
  |map(select(.key|test("^(name)$")))
  |from_entries
)
于 2022-01-27T19:10:24.437 回答