使用jq修改对象内数组:筛选b属性匹配当前对象a属性的元素
jq数组筛选优化方案
需求说明
现有对象数组,需要对每个对象的b属性数组做筛选,仅保留与当前对象a属性值相等的元素。
示例输入
[ { "a": 3, "b": [ 1, 2, 3 ] }, { "a": 5, "b": [ 3, 5, 4, 3, 5 ] } ]
期望输出
[ { "a": 3, "b": [ 3 ] }, { "a": 5, "b": [ 5, 5 ] } ]
优化实现
你原有的实现逻辑完全正确,这里提供两种更简洁、可读性更高的写法:
写法1:可读性优先(推荐)
使用jq内置map()函数替代手动数组展开封装的语法,语义更清晰:
map(.a as $a | .b |= map(select(. == $a)))
优势:
- 外层
map()直接处理输入数组的每个对象,省去[.[] | ...]的冗余写法 - 内层
b数组的筛选也用map()实现,代码结构更扁平,不需要嵌套额外的方括号 - 函数语义直白,阅读时可以快速理解是对两层数组分别做转换操作
写法2:极致简短版本
如果需要更短的代码,可以省略部分不必要的空格和括号,效果完全一致:
[.[]|.a as $a|.b|=map(select(.==$a))]
两种写法的输出和你原实现完全相同,性能也没有差异,日常使用更推荐优先选择可读性更好的第一种写法。
内容的提问来源于stack exchange,提问作者Paul Draper
相关产品推荐
相关产品推荐

