在jq中"转置"对象

cmb*_*ley 4 json transpose relation jq

我不确定"transpose"在这里是否是正确的术语,但我希望用它jq来转置这样的二维对象:

[
    {
        "name": "A",
        "keys": ["k1", "k2", "k3"]
    },
    {
        "name": "B",
        "keys": ["k2", "k3", "k4"]
    }
]
Run Code Online (Sandbox Code Playgroud)

我想将其转换为:

{
    "k1": ["A"],
    "k2": ["A", "B"],
    "k3": ["A", "B"],
    "k4": ["A"],
}
Run Code Online (Sandbox Code Playgroud)

我可以拆分对象.[] | {key: .keys[], name}以获取键和名称列表,或者我可以.[] | {(.keys[]): [.name]}用来获取键值对的集合{"k1": ["A"]}等等,但我不确定这两种方法的最终连接步骤.

这些方法中的任何一个都朝着正确的方向前进吗?有没有更好的办法?

Jef*_*ado 5

这应该工作:

map({ name, key: .keys[] })
    | group_by(.key)
    | map({ key: .[0].key, value: map(.name) })
    | from_entries
Run Code Online (Sandbox Code Playgroud)

基本方法是将每个对象转换为名称/密钥对,按键重新组合,然后将它们映射到对象的条目.

这会产生以下输出:

{
  "k1": [ "A" ],
  "k2": [ "A", "B" ],
  "k3": [ "A", "B" ],
  "k4": [ "B" ]
}
Run Code Online (Sandbox Code Playgroud)