如何用jq将字体对应char字段值拼接为字符串并生成映射
用JQ实现按字体聚合字符拼接
输入JSON数据:
{ "font1": { "charInfo": [ { "char": "a", "other_stuff": 12 }, { "char": "b", "other_stuff": 63 } ] }, "font2": { "charInfo": [ { "char": "s", "other_stuff": 1 }, { "char": "x", "other_stuff": 4 } ] } }
期望输出:
{ "font1": "ab", "font2": "sx" }
你当前的jq命令生成的是包含font和chars字段的独立对象,无法直接将font值转为键名。可以通过JQ的动态键构造语法解决这个问题,下面提供两种可行的命令:
方法一:借助to_entries/from_entries转换
jq 'to_entries | map({key: .key, value: .value.charInfo | map(.char) | join("")}) | from_entries'
步骤说明:
to_entries:将原对象转为[{key: "font1", value: {...}}, ...]的数组结构,便于逐个处理字体项。map(...):遍历每个条目,提取charInfo中的char字段并拼接成字符串:.value.charInfo | map(.char):从每个字体的charInfo数组中取出所有char值,得到字符数组(如["a", "b"])。join(""):将字符数组拼接为连续字符串(如"ab")。
from_entries:把处理后的条目数组重新转换为键值对对象,得到最终格式。
方法二:直接构建动态键对象并合并
jq '[keys[] as $k | {($k): .[$k].charInfo | map(.char) | join("")}] | add'
步骤说明:
keys[] as $k:遍历原对象的所有键(font1、font2)。{($k): ...}:用括号包裹变量$k实现动态键名,对应的值为拼接后的字符字符串。add:将生成的多个单键对象合并为一个完整的对象。
内容的提问来源于stack exchange,提问作者Gavriel
相关产品推荐
相关产品推荐

