Если $ paths содержит массив явных jq-путей (например, [ ["turtles", 0, "name"], ["cast"]])
, самый простой подход - использовать следующий фильтр:
. as $in
| reduce $paths[] as $p (null; setpath($p; $in | getpath($p)))
Расширенные выражения пути
InДля того, чтобы иметь возможность обрабатывать расширенные выражения пути, такие как ["turtles", [], "name"], где []
предназначен для диапазона по индексам массива turtles
, мы определим следующую вспомогательную функцию:
def xpath($ary):
. as $in
| if ($ary|length) == 0 then null
else $ary[0] as $k
| if $k == []
then range(0;length) as $i | $in[$i] | xpath($ary[1:]) | [$i] + .
else .[$k] | xpath($ary[1:]) | [$k] + .
end
end ;
Для изложения определим также:
def paths($ary): $ary[] as $path | xpath($path);
Затем с заданным вводом выражение:
. as $in
| reduce paths([ ["turtles", [], "name"], ["cast"]]) as $p
(null; setpath($p; $in | getpath($p)) )
производит выводпоказано ниже.
Использование path
Следует отметить, что одним из способов обработки выражений, таких как ".turtles []. name", было бы использование встроенного фильтра path/1
.
Например:
# Emit a stream of paths:
def paths: path(.turtles[].name), ["cast"];
. as $in
| reduce paths as $p (null; setpath($p; $in | getpath($p)))
Вывод:
{
"turtles": [
{
"name": "Leonardo"
},
{
"name": "Michelangelo"
},
{
"name": "Donatello"
},
{
"name": "Raphael"
}
],
"cast": "Megan Fox, Will Arnett, Tyler Perry"
}