Используйте jq для преобразования массива в объект по неуникальным ключам - PullRequest
0 голосов
/ 17 марта 2020

У меня есть массив JSON, подобный этому:

[
  {
    "name": "Bo",
    "type": "dog"
  },
  {
    "name": "Roxer",
    "type": "dog"
  },
  {
    "name": "Paws",
    "type": "cat"
  }
]

Я пытаюсь преобразовать его в объект с ключом type, например:

{
  "dog": [
    {
      "name": "Bo",
      "type": "dog"
    },
    {
      "name": "Roxer",
      "type": "dog"
    }
  ],
  "cat": [
    {
      "name": "Paws",
      "type": "cat"
    }
  ]
}

Я нашел этот ответ , который использует карту, но предполагает, что type уникален и не преобразует его в массив:

reduce .[] as $i ({}; .[$i.type] = $i)

При первом добавлении значения, он должен быть вставлен как [$i]. В любое другое время к нему следует добавить [] + $i.

Ответы [ 2 ]

4 голосов
/ 17 марта 2020

Ваш случай отличается от того, который вы нашли , потому что вы помещаете объекты в массив. Попробуйте эту модификацию решения Джеффа Меркадо.

jq 'reduce .[] as $i ({}; .[$i.type] += [$i])'
1 голос
/ 07 апреля 2020

Другой возможный способ - использовать group_by() в поле .type, а затем создать конечный результат с .type в качестве ключа

jq 'group_by(.type)[] | { (.[0].type) : . }'

. Единственное отличие в этом подходе - group_by() делает отсортировать по полю .type до получения результата, поэтому порядок ключей будет другим.

...