如何基于键名重构JSON数组?jq批量处理所有键的方法
用JQ批量处理所有键,重组数组结构
原始数据
{ "data": [ { "a": 11, "b": 12, "c": 13 }, { "a": 21, "b": 22, "c": 23 }, { "a": 31, "b": 32, "c": 33 } ] }
目标结构
希望将数据重组为每个键对应一个值数组的形式:
{ "data": [ { "a": [ 11, 21, 31 ] }, { "b": [ 12, 22, 32 ] }, { "c": [ 13, 23, 33 ] } ] }
现有单键处理代码
目前能处理单个指定键的JQ命令:
jq '(.data[0]|keys_unsorted) as $keys | { ($keys[2]): [.data[]|.[$keys[2]]] }' data.json
执行结果仅输出指定键的数组:
{ "c": [ 13, 23, 33 ] }
解决方案
要批量处理所有键,只需对获取到的键数组进行遍历映射,为每个键生成对应的键值对对象,最后将这些对象包裹到data数组中。
使用以下JQ命令:
jq '(.data[0]|keys_unsorted) as $keys | { data: [$keys[] | { (.): [.data[]|.[.]] }] }' data.json
代码解释
(.data[0]|keys_unsorted) as $keys:获取第一个对象的所有键,保持原始顺序并存为变量$keys$keys[]:遍历每个键{ (.): [.data[]|.[.]] }:对当前遍历的键,生成一个以该键为键名,值为所有数据对象中该键对应值组成的数组的对象[$keys[] | ...]:将所有生成的对象收集为一个数组{ data: [...] }:将这个数组包裹到data字段中,得到目标结构
内容的提问来源于stack exchange,提问作者Glenn
相关产品推荐
相关产品推荐

