Учитывая следующий файл JSON:
{
"quadrants": [
"Languages + Frameworks",
"Tools",
"Platforms",
"Techniques"
],
"entries": [
{
"quadrant": "Languages + Frameworks"
},
{
"quadrant": "Platforms"
},
{
"quadrant": "Languages + Frameworks"
}
]
}
Как можно заменить поле квадранта каждой записи индексом соответствующего значения в квадрантах?
Ожидаемый результат:
{
"quadrants": [
"Languages + Frameworks",
"Tools",
"Platforms",
"Techniques"
],
"entries": [
{
"quadrant": 0
},
{
"quadrant": 2
},
{
"quadrant": 0
}
]
}
Я попробовал следующий скрипт jq, но получил null
для каждого квадранта.
jq '
.entries |= map(
.quadrant = (.quadrant as $q | (.quadrants | index($q)))
)
' "$1"
Вы ищете что-то вроде этого:
.quadrants as $l | .entries[].quadrant |= . as $e | $l | index($e)
Вы также можете использовать двойные скобки для поиска индекса:
.quadrants as $q | .entries[].quadrant |= $q[[.]][]
Если элементы в массиве квадрантов могут встречаться несколько раз, используйте вместо них first($q[[.]][])
.
Для больших входных данных со многими потенциально дорогостоящими поисковыми запросами вы можете заранее создать поиск INDEX
, а затем эффективно просто запросить следующее:
(.quadrants | to_entries | INDEX(.value)) as $i | .entries[].quadrant |= $i[.].key
Это работает. Спасибо, любезно.