JQ如何通过传入的数组参数匹配Key并批量更新对应Value
解决方案
错误原因
- jq内置的
in运算符作用是判断某个键是否存在于对象中,无法直接用于判断元素是否存在于数组,所以你原来的写法逻辑不生效。
实现方法
方法1:使用index()函数(适合标签数量少的场景)
直接用数组的index方法查询当前Key是否在传入的标签列表中:
jq --argjson TAGS '["Tag1","Tag2"]' --arg NEW_VALUE '987-654' \ '[.[] |= if($TAGS | index(.Key)) then (.Value = $NEW_VALUE) else . end]'
说明:index函数会返回元素在数组中的下标,找不到则返回null,if判断会自动把null识别为假值,非空下标识别为真值,刚好匹配需求。
方法2:转查询对象(适合标签数量多的场景)
如果传入的标签列表很长,先把列表转成键为标签名的对象,再用in查询,性能更高:
jq --argjson TAGS '["Tag1","Tag2"]' --arg NEW_VALUE '987-654' \ '($TAGS | reduce .[] as $tag ({}; .[$tag] = true)) as $tag_map | [.[] |= if(.Key | in($tag_map)) then (.Value = $NEW_VALUE) else . end]'
输出示例
运行后得到的结果如下:
[ { "Key": "IDontCare", "Value": "something" }, { "Key": "Tag1", "Value": "987-654" }, { "Key": "Tag2", "Value": "987-654" } ]
内容的提问来源于stack exchange,提问作者MLu
相关产品推荐
相关产品推荐

