jq过滤器聚合到对象的属性中

时间:2019-03-07 20:50:08

标签: json group-by aggregate jq

我需要转换JSON以更新Firebase Firestore。

我传入的json看起来像这样:

[{
    "ItemID": 1,
    "Size": 10,
    "Price": 5
},
{
    "ItemID": 1,
    "Size": 11,
    "Price": 7
},
{
    "ItemID": 1,
    "Size": 12,
    "Price": 10
},
{
    "ItemID": 2,
    "Size": 11,
    "Price": 15
},
{
    "ItemID": 2,
    "Size": 12,
    "Price": 20
}]

而且我需要JSON看起来像这样:

[{
    "ItemID": 1,
    "Price": {
        "10": 5,
        "11": 7,
        "12": 10
    }
},
{
    "ItemID": 2,
    "Price": {
        "11": 15,
        "12": 20
    }
}]

请问我需要什么jq过滤器?

我的其他选择是在javascript中循环访问,但是我想使它可扩展,以便可以添加,保存和运行模式。

我的另一种选择是不将值存储为键,而是执行以下操作:

[
  {
    "ItemID":1,
    "Prices":[
      {"Size":10, "Price":5}
    ]
  }
]

1 个答案:

答案 0 :(得分:1)

修复JSON之后,以下过滤器将产生如下所示的输出:

group_by(.ItemID)
| map( reduce .[] as $x ( .[0] | {ItemID};
         .Price += ($x | {(.Size|tostring): .Price}) ) )

输出:

[
  {
    "ItemID": 1,
    "Price": {
      "10": 5,
      "11": 7,
      "12": 10
    }
  },
  {
    "ItemID": 2,
    "Price": {
      "11": 15,
      "12": 20
    }
  }
]