Simple and efficient implementation of walk/1 (#2795)

This commit is contained in:
pkoppstein authored and GitHub committed 2023-08-01 07:54:21 +09:00
1 parent 0f80921268
commit 4d4c17ca6a
2 files changed
+27 -7

No files matched your search

+8 -7
View File
@@ -246,13 +246,14 @@ def bsearch($target):
# Apply f to composite entities recursively, and to atoms
def walk(f):
. as $in
| if type == "object" then
reduce keys_unsorted[] as $key
( {}; . + { ($key): ($in[$key] | walk(f)) } ) | f
elif type == "array" then map( walk(f) ) | f
else f
end;
def w:
if type == "object"
then map_values(w)
elif type == "array" then map(w)
else .
end
| f;
w;
# pathexps could be a stream of dot-paths
def pick(pathexps):
+19
View File
@@ -1975,3 +1975,22 @@ implode|explode
map(try implode catch .)
[123,["a"],[nan]]
["implode input must be an array","string (\"a\") can't be imploded, unicode codepoint needs to be numeric","number (null) can't be imploded, unicode codepoint needs to be numeric"]
# walk
walk(.)
{"x":0}
{"x":0}
walk(1)
{"x":0}
1
# The following is a regression test, not a requirement:
[walk(.,1)]
{"x":0}
[{"x":0},1]
# Issue #2584
walk(select(IN({}, []) | not))
{"a":1,"b":[]}
{"a":1}