Jq: присвоение вычисленному свойству объекта

Я пытаюсь заставить jq сгенерировать объект, ключи которого вычисляются.

Это не сработало:

$ jq -n --arg key foo '{} as $o | $o[$key] = 42'
jq: error (at <unknown>): Invalid path expression near attempt to access element "foo" of {}

Этого тоже не произошло:

$ jq -n --arg key foo '{} as $o | ($o | .[$key]) = 42'
jq: error (at <unknown>): Invalid path expression near attempt to access element "foo" of {}

Но это сработало:

$ jq -n --arg key foo '{} as $o | ($o | setpath([$key]; 42))'
{
  "foo": 42
}

Итак, мой вопрос: существует ли синтаксис присваивания, который может дать тот же эффект?

Как сделать HTTP-запрос в Javascript?
Как сделать HTTP-запрос в Javascript?
В JavaScript вы можете сделать HTTP-запрос, используя объект XMLHttpRequest или более новый API fetch. Вот пример для обоих методов:
1
0
54
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

Левая часть знака равенства должна быть значением .. Поставьте $o., а затем выполните задание так:

$o | .[$key] = 42

Хорошо, я был близок со второй попыткой, только закрыл скобку перед заданием.

Jeenu 25.07.2024 08:17

Если вы хотите изменить контекст, сначала оцените в нем переменную, а затем обновите контекст:

jq -n --arg key foo '{} as $o | $o | .[$key] = 42'

Демо

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

jq -n --arg key foo '{} as $o | ($o | .[$key] = 42) as $o | …'

Демо

Примечание: в последнем случае не может быть пустым.

Переменные в jq неизменяемы, поэтому первые два утверждения выдают ошибки.

Третий оператор успешен, потому что изменилось текущее значение канала, а не $o, вы можете увидеть это с помощью:

$ jq -n --arg key foo '{} as $o | ($o | setpath([$key]; 42)) | $o, .'
{}
{
  "foo": 42
}

Вы можете моделировать изменяемые переменные с помощью:

$ jq -n --arg key foo '.o = {} | .o[$key] = 42 | .o'
{
  "foo": 42
}

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