gpt4 book ai didi

json - jq:将对象数组中的字段提升到父对象中

转载 作者:行者123 更新时间:2023-12-04 17:41:45 24 4
gpt4 key购买 nike

我在顶层有一个 JSON 对象和一个数组,每个数组条目都是一个对象,其中包含一个嵌套的对象数组作为字段之一。
我想将子数组中的一些字段“提升”到第一个数组中的对象中。写起来很困惑,所以,这是我的输入:

{ "emails": [
{ "email":"foo1@bar.com",
"events":[
{ "type":"open", "time":"t1", "ignore":"this" },
{ "type":"click", "time":"t2", "ignore":"this" } ] },
{ "email":"foo2@bar.com",
"events":[
{ "type":"open", "time":"t3", "ignore":"this" },
{ "type":"click", "time":"t4", "ignore":"this" },
{ "type":"open", "time":"t5", "ignore":"this" } ] }
] }

我想收到的输出是:
[
{ "email":"foo1@bar.com", "type":"open", "time":"t1" },
{ "email":"foo1@bar.com", "type":"click", "time":"t2" },
{ "email":"foo2@bar.com", "type":"open", "time":"t3" },
{ "email":"foo2@bar.com", "type":"click", "time":"t4" },
{ "email":"foo2@bar.com", "type":"open", "time":"t5" }
]

我可以 jq这已经有多个管道,如下所示:
 [ .emails[] | { email:.email, event:(.events[] | { type:.type, time:.time }) } | { email:.email, type:.event.type, time:.event.time } ]

……但这似乎太冗长了。
有没有更简单的方法来“解除”那些 typetime从最深的对象到上一级对象的字段?
当我尝试使用 .events[] 时迭代器两次,我最终得到了事件的笛卡尔积,这是错误的:-/

我必须缺少一些更简单的方法(比我上面的“中间对象”方法)来实现这一点......有人知道更好的方法吗?

最佳答案

让我们分两步进行:首先,(重)提升,其次,(轻)修剪。

起重

.emails | map( {email}  + .events[])

或等效地:
[.emails[] | {email}  + .events[]]

请注意 {"email": .email}已缩写为 {email} .

修剪

我们可以使用 del(.ignore) 删除“忽略”键.着眼于效率,我们得出以下解决方案:
.emails | map( {email}  + (.events[] | del(.ignore) ) )

关于json - jq:将对象数组中的字段提升到父对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54187750/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com