如何用jq按国家及层级值分组数组并封装实体?
用JQ实现按国家分组并分层级归类数据
需求说明
给定输入JSON,需完成以下处理:
- 按
country字段分组 - 将条目分为两类:包含
H1/H2层级的为一组,包含H3/H4层级的为另一组 - 每组内的
id和level字段封装到名为entities的数组中
输入JSON
{ "hits": [ { "country": "PT", "level": "H2", "id": "id1" }, { "country": "PT", "level": "H1", "id": "id2" }, { "country": "CZ", "level": "H2", "id": "id3" }, { "country": "IT", "level": "H2", "id": "id4" }, { "country": "PT", "level": "H3", "id": "id5" }, { "country": "PT", "level": "H3", "id": "id6" }, { "country": "PT", "level": "H4", "id": "id7" } ] }
期望输出
{ "hits": [ { "country": "PT", "entities": [ { "id": "id2", "level": "H1" }, { "id": "id1", "level": "H2" } ] }, { "country": "CZ", "entities": [ { "id": "id3", "level": "H2" } ] }, { "country": "IT", "entities": [ { "id": "id4", "level": "H2" } ] }, { "country": "PT", "entities": [ { "id": "id5", "level": "H3" }, { "id": "id6", "level": "H3" }, { "id": "id7", "level": "H4" } ] } ] }
JQ解决方案
执行以下JQ命令即可实现需求:
.hits | group_by(.country) | map( group_by( if .level | IN("H1", "H2") then "high" else "low" end ) | map({ country: first.country, entities: map({id, level}) }) ) | flatten | {hits: .}
命令分步解释
.hits:提取顶层的hits数组,作为后续操作的数据源group_by(.country):将所有条目按country字段分组,得到每个国家对应的条目数组- 内层
group_by(...):对每个国家的条目数组,进一步按层级分类:判断level是否为H1或H2,是则归为"high"组,否则归为"low"组,每个国家最多生成两个分组 map({country: first.country, entities: map({id, level})}):将每个分组转换为目标格式,country取分组内第一个条目的值,entities是分组内每个条目仅保留id和level字段后的数组flatten:将嵌套的数组结构展平为一维数组,确保最终hits是单层数组{hits: .}:将处理后的数组包装回顶层的hits对象,匹配期望的输出结构
内容的提问来源于stack exchange,提问作者António
相关产品推荐
相关产品推荐

