如何用jq匹配数组值完全符合指定值的首个对象
问题:匹配首个size数组完全符合指定宽高的对象
- 需求:从JSON数组中找到首个
size数组(长度固定为2)与指定[width, height]完全一致的对象,后续提取该对象的id(提取id部分已掌握)
示例数据
JSON数组
[ { "id": 242, "size": [500, 500] }, { "id": 234, "size": [500, 1920] }, { "id": 168, "size": [234, 1080] }, { "id": 315, "size": [1080, 1920] }, { "id": 366, "size": [1920, 1080] }, { "id": 367, "size": [1920, 1080] } ]
指定参数
width=1920 height=1080
预期结果
匹配到的首个对象:
{ "id": 366, "size": [1920, 1080] }
之前的错误尝试
用contains无法实现精确匹配,只会匹配包含指定值的元素:
echo $json | jq -r ".[] | select( [ .size[] | contains($width) ] | any ) | .id"
解决方案
直接用数组精确相等判断,结合first取首个匹配项即可:
完整匹配对象的命令
echo "$json" | jq --arg w "$width" --arg h "$height" 'first(.[] | select(.size == [$w | tonumber, $h | tonumber]))'
命令细节
--arg参数:把shell里的width和height传入jq,避免字符串拼接的安全问题tonumber:将传入的字符串参数转为数字,和JSON里的数字类型匹配.size == [...]:严格判断数组的顺序和值完全一致first:从所有符合条件的对象中取第一个
直接提取id的命令
如果不需要整个对象,直接拿id:
echo "$json" | jq --arg w "$width" --arg h "$height" -r 'first(.[] | select(.size == [$w | tonumber, $h | tonumber])).id'
内容的提问来源于stack exchange,提问作者sloppy
相关产品推荐
相关产品推荐

