jq сопоставляет значение ключа объекта с массивом объектов, содержащих оба

Я хотел бы поместить родительский ключ объекта внутри самого объекта и преобразовать каждую пару значений ключа в массив

Дано:

{
  "field1": {
    "key1": 11,
    "key2": 10
  },
  "field2": {
    "key1": 11,
    "key2": 10
  }
}

Желаемый результат

[
   {"name": "field1", "key1": 11, "key2": 10},
   {"name": "field2", "key1": 11, "key2": 10}
]

Я знаю, что jq keys дал бы мне ["field1", "field2"], а jq '[.[]]' дал бы

[
  { "key1": 11, "key2": 10 },
  { "key1": 11, "key2": 10 }
]

Я не могу понять, как их объединить, как мне это сделать?


person Yavor Lulchev    schedule 12.06.2020    source источник


Ответы (2)


Создайте объект в форме {"name": <key>} для каждого ключа и объедините его со значением ключа.

to_entries | map({name: .key} + .value)

or:

[keys_unsorted[] as $k | {name: $k} + .[$k]]
person oguz ismail    schedule 12.06.2020

Что-то вроде ниже. Получите список ключей в JSON, используя keys[], и добавьте новое поле name, индексируя ключ для каждого объекта.

jq '[ keys[] as $k | { name: $k } + .[$k] ]'

Если вы хотите сохранить порядок ключей, используйте keys_unsorted[].

person Inian    schedule 12.06.2020