JQ фильтр для агрегирования в свойство объекта - PullRequest
1 голос
/ 07 марта 2019

Мне нужно преобразовать JSON, чтобы обновить пожарную базу Firebase.

Мой входящий 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 Ответ

1 голос
/ 08 марта 2019

После исправления 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
    }
  }
]
...