Я пытаюсь заставить 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
}
Итак, мой вопрос: существует ли синтаксис присваивания, который может дать тот же эффект?
Левая часть знака равенства должна быть значением .
. Поставьте $o
.
, а затем выполните задание так:
$o | .[$key] = 42
Если вы хотите изменить контекст, сначала оцените в нем переменную, а затем обновите контекст:
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
}
Хорошо, я был близок со второй попыткой, только закрыл скобку перед заданием.