如何用jq惯用方式按值聚合对象键 实现键值翻转分组
推荐方案
优先推荐优化后的 reduce 写法,逻辑直白,符合jq社区惯用写法,同时兼顾效率和可读性:
reduce to_entries[] as $item ({}; .[$item.value] = (.[$item.value] // []) + [$item.key] )
方案说明
- 首先用
to_entries把原始对象转换为{key: 人员名, value: 部门}的结构数组 - 用
reduce遍历所有条目,初始化空对象作为结果容器 - 遍历过程中直接把当前人员名追加到对应部门的数组中:如果部门键不存在,
// []会先初始化为空数组,再拼接当前人员名 - 没有多余的中间结构转换,也避免了之前方案中用
*运算符合并对象的冗余逻辑,可读性提升非常明显
如果你偏好分组的写法,也可以优化你提到的方案1,简化为更紧凑的版本:
to_entries | group_by(.value) | from_entries(map({key: .[0].value, value: map(.key)}))
两种方案的选型建议
- 数据量较小时两种写法差异可忽略,优先选更短的reduce版本
- 数据量极大时,reduce版本性能稍好,因为不需要额外的分组和数组映射操作
内容的提问来源于stack exchange,提问作者pcronin
相关产品推荐
相关产品推荐

