当数组名称未知时,将数组分组并将它们移动到新对象下

Group arrays and move them under new object when array names are not known

我有以下JSON

[
    {
        "name": "T1",
        "R10": ["A","B"]
    },
    {
        "name": "T1",
        "M20": ["C"]
    },
    {
        "name": "A1",
        "C20": ["A","B"]
    },
    {
        "name": "B1",
        "V30": ["3"]
    },
    {
        "name": "C1",
        "X50": ["1"]
    }
]

我想根据 "name" 对数组进行分组并将它们推送到新的 "Arrays" 对象下。所以结果应该如下所示:

[
    {
        "name": "T1",
        "Arrays": {
            "R10": ["A","B"],
            "M20": ["C"]
        }
    },
    {
        "name": "A1",
        "Arrays": {
            "C20": ["A","B"]
        }
    },
    {
        "name": "B1",
        "Arrays": {
            "V30": ["3"]
        }
    },
    {
        "name": "C1",
        "Arrays": {
            "X50": ["1"]
        }
    }
]

我可以根据 "name" 的值进行选择 [.[] | select ( .name | test("T1") )] | add - 它确实将数组组合在一起,但我不知道如何概括过滤器 - 将其应用于整个 JSON 而不是根据名称进行过滤。

如果我事先不知道数组的名称,我也卡在如何将数组推送到 "Arrays" 对象下。

这肯定需要 group_by/1.name 字段上,然后根据需要重新排序对象。

[ group_by(.name)[] | add ] | map( { name: .name, Arrays: del(.name) } )

由于 group-by 函数对应用的字段进行内部排序,即在您的情况下为 .name,因此最终结果的键顺序由 [=12= 的升序决定] 字段。

Demo - jqplay