#json #api #jq
Вопрос:
У меня есть следующий тип массива:
{
"name": [
"Paul",
"Alex",
"John"
],
"age": [
"22",
"31",
"56"
],
"town": [
"New York",
"Los Angeles",
"Detroit"
]
}
Исходя из этого, я хочу создать новые массивы с соответствующей информацией, объединенные в один большой массив, называемый «элементы».
{"items": [
{
"name": "Paul",
"age": "22",
"town": "New York"
},
{
"name": "Alex",
"age": "31",
"town": "Los Angeles"
},
{
"name": "John",
"age": "56",
"town": "Detroit"
},
]}
Я обнаружил, что могу сделать что-то подобное, чтобы получить первую строку в массиве, но я не могу найти, как выполнить итерацию по всем строкам.
jq '{items: [{ name: .name | first, age: .age | first, town: .town | first}]}'
Ответ №1:
Вот простое решение, которое было бы легко адаптировать для обработки переименования ключей:
[.[]]
| transpose
| {items: map( {name: .[0], age: .[1], town: .[2] } )}
Комментарии:
1. Спасибо! Я думаю, что я пойду с этим, так как мне действительно нужно переименовать ключи (о чем я забыл упомянуть).
Ответ №2:
Вот решение, которое позволяет легко обрабатывать имена ключей без явного упоминания любого из них:
def objectify($keys):
with_entries( .key |= $keys[.] );
keys_unsorted as $keys
| [.[]]
| transpose
| {items: map( objectify($keys) )}