如何使用jq为动态键对应的数组追加值?
解决动态键下的jq数组追加问题
你遇到的问题是jq在访问动态键属性时的语法差异——构造对象时的动态键写法{($key): ...}和访问已有属性时的规则不一样,导致了编译错误。
正确的命令写法
要实现动态键对已有数组的追加,你需要用方括号语法访问动态键,而不是.($key)。正确的命令如下:
echo '{"foo": ["baz"]}' | jq --arg key "foo" --arg value "bar" '.[$key] += [$value]'
执行后会得到你预期的输出:
{"foo": ["baz", "bar"]}
为什么之前的写法错误?
jq的语法规则里:
- 当构造新对象时,动态键需要用
{($key): ...}这种带括号的写法,比如你提到的jq --null-input --arg key foo '{($key): "bar"}',这是专门用于创建带动态键的对象的语法。 - 当访问已有对象的属性时,动态键必须使用
.[$key]的方括号语法,.($key)这种写法不符合jq的解析规则,所以会报编译错误。
另一种等价写法
你也可以用|=操作符结合数组拼接来实现,效果完全相同:
echo '{"foo": ["baz"]}' | jq --arg key "foo" --arg value "bar" '.[$key] |= . + [$value]'
这里|=表示把左边属性的值传递给右边的表达式,. + [$value]就是在原有数组基础上追加新元素。
内容的提问来源于stack exchange,提问作者fata
相关产品推荐
相关产品推荐

