【发布时间】:2017-07-23 21:56:50
【问题描述】:
我有一个对象,我可以过滤到我希望保留的多个路径。路径的形式为:
[
"key1",
"key2",
"mykey"
]
[
"key3",
"key4",
"mykey"
]
我想要的是:
{ "key1":{
"key2": .key2
},
"key3":{
"key4": .key4
}
}
我能得到的最接近的是:
{ "key1":{
"key2": .key2
}
}
{ "key3":{
"key4": .key4
}
使用:
(paths(objects)|select(last(.[])=="mykey")) as $path|
getpath([$path[0],$path[1]]) as $getpath|
{($path[0]):{($path[1]):$getpath}}
虽然我可以将此输出通过管道传输到 jq -s '.'命令,我找不到将原始过滤器集中的路径重建相加的方法。过滤器似乎在每个对象的末尾重置。 $path 似乎一次只保存一个路径数组,而不是一个路径数组。这可以防止我在 reduce 函数中迭代 $path。
我创建了以下有效的脚本,但我也有兴趣了解如何使用 paths() 函数。到目前为止,我还没有想出如何让它对我非常有用。
(to_entries |
map(select(.["value"][]?|has("mykey")?))|[.[].key]) as $rooms|
(to_entries |
map(select(.["value"][]?|has("mykey")?))|[.[].value]) as $roomvals| #allows room paths to be avail
##### creates object containing only those locations and sensors within the locations that include "mykey" objs
reduce
range(0;$rooms|length) as $i ({};
.+{($rooms[$i]): ($roomvals[$i] | to_entries |
map(select(.["value"]|has("mykey")))|{(.[]["key"]):.[]["value"]})})
对这些方法的任何帮助或替代方法的建议表示赞赏。
【问题讨论】: