/ / So wenden Sie eine Funktion rekursiv auf alle Zeichenfolgen in der Datensatzstruktur an, indem Sie jq - json, recursion, jq verwenden

So wenden Sie eine Funktion rekursiv mit jq auf alle Zeichenfolgen in der Datensatzstruktur an - json - recursion, jq

Ist es möglich, eine rekursive Transformation auf einen Datensatz anzuwenden, um denselben Datensatz zurückzugeben, aber alle zu haben? string Werte zugeordnet?

Beispielsweise:

{"x":"1", "a": {"b": 2, "c": ["a"]}, "d": {"e": "z"}}

mit einer Zuordnung von "add prime" angewendet:

{"x":"1"", "a": {"b": 2, "c": ["a""]}, "d": {"e": "z""}}

Ich habe versucht, eine Kombination von recurse, map, string und select mit etwas Glück. Irgendwelche Ideen?

Antworten:

3 für die Antwort № 1

Sie können dies auch einfach mit dem Rekursionsoperator tun:

jq "(.. | strings) += """"

Woher .. erzeugt einen Stream durch rekursives Durchlaufen jedes Elements der Eingabe. strings filtert den Stream für diejenigen, die Zeichenfolgen sind, += fügt jedem Element im linken Stream und das rechte Element hinzu """ ist ein Literal, das die "Primzahl" enthält, die Sie suchen.


2 für die Antwort № 2

Ja, benutzen walk/1. Es wird in der erklärt jq Handbuch.

Wenn Ihr jq es nicht definiert hat, ist hier seine Definition von builtin.jq:

# Apply f to composite entities recursively, and to atoms
def walk(f):
. as $in
| if type == "object" then
reduce keys[] as $key
( {}; . + { ($key):  ($in[$key] | walk(f)) } ) | f
elif type == "array" then map( walk(f) ) | f
else f
end;

0 für die Antwort № 3

Hier ist eine Lösung, die verwendet Pfade / 1 um Zeichenfolgenwerte zu identifizieren und mit zu aktualisieren reduzieren, setpath und getpath

reduce paths(type == "string") as $p (
.
; setpath($p; getpath($p) + """)
)