Заменить поле индексом значений в массиве в JQ

Учитывая следующий файл 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"
Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
0
0
63
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы ищете что-то вроде этого:

.quadrants as $l | .entries[].quadrant |= . as $e | $l | index($e)

Это работает. Спасибо, любезно.

A Dev 04.07.2024 11:48

Вы также можете использовать двойные скобки для поиска индекса:

.quadrants as $q | .entries[].quadrant |= $q[[.]][]

Демо

Если элементы в массиве квадрантов могут встречаться несколько раз, используйте вместо них first($q[[.]][]).

Для больших входных данных со многими потенциально дорогостоящими поисковыми запросами вы можете заранее создать поиск INDEX, а затем эффективно просто запросить следующее:

(.quadrants | to_entries | INDEX(.value)) as $i | .entries[].quadrant |= $i[.].key

Демо

Другие вопросы по теме