сопоставить массив с объектами с определенным полем c в качестве ссылки - PullRequest
0 голосов
/ 16 июня 2020

У меня есть следующий массив JSON, созданный из информации пула ZFS, к которому было добавлено поле узла (которое, конечно, может иметь много элементов, так как узлов много): Я хотел бы сопоставить это с этим типом формата объекта, сделав поле новым `` ключом '' и вернуть объект с этим полем в качестве ключа к массиву исходных данных без этого ключа: (Почти как группировка данных по определенному полю)

{
  "node1": [
    {
      "VolumeName": "vol1",
      "Size": "50.0T",
      "Used": "18.6T",
      "Free": "31.4T",
      "Fragmentation": "31%",
      "Capacity": "37%",
      "Health": "ONLINE"
    },
    {
      "VolumeName": "vol2",
      "Size": "796G",
      "Used": "28.5M",
      "Free": "796G",
      "Fragmentation": "0%",
      "Capacity": "0%",
      "Health": "ONLINE"
    }
  ]
}

Я считаю, что map или group-by - это способ go, но не получение требуемого результата. Любые предложения будут полезны. Спасибо.

Ответы [ 2 ]

1 голос
/ 16 июня 2020

Сгруппировать по .NodeName и проиндексировать каждую группу с этим значением в объекте. Затем удалите поле NodeName из всех участников.

group_by(.NodeName)
| INDEX(.[]; .[0].NodeName)
| del(.[][].NodeName)

Онлайн-демонстрация

0 голосов
/ 16 июня 2020

Вы можете использовать group_by() на NodeName, а затем использовать это как ключ при формировании окончательного JSON. del(.NodeName) необходим, потому что вам не нужно добавлять имя узла в окончательный сгруппированный результат.

jq 'group_by(.NodeName)[] | { (.[0].NodeName) : map(del(.NodeName)) }'

или использовать функцию reduce(). Индексируйте по каждому уникальному имени узла и добавьте отдельные объекты, удалив имя узла.

jq 'reduce .[] as $d ({}; .[ $d.NodeName ] += [ $d | del(.NodeName) ] )'
...