Simple and efficient implementation of walk/1 (#2795)
This commit is contained in:
1 parent
0f80921268
commit
4d4c17ca6a
2 files changed
+27
-7
No files matched your search
+8
-7
@@ -246,13 +246,14 @@ def bsearch($target):
|
|||||||
|
|
||||||
# Apply f to composite entities recursively, and to atoms
|
# Apply f to composite entities recursively, and to atoms
|
||||||
def walk(f):
|
def walk(f):
|
||||||
. as $in
|
def w:
|
||||||
| if type == "object" then
|
if type == "object"
|
||||||
reduce keys_unsorted[] as $key
|
then map_values(w)
|
||||||
( {}; . + { ($key): ($in[$key] | walk(f)) } ) | f
|
elif type == "array" then map(w)
|
||||||
elif type == "array" then map( walk(f) ) | f
|
else .
|
||||||
else f
|
end
|
||||||
end;
|
| f;
|
||||||
|
w;
|
||||||
|
|
||||||
# pathexps could be a stream of dot-paths
|
# pathexps could be a stream of dot-paths
|
||||||
def pick(pathexps):
|
def pick(pathexps):
|
||||||
|
|||||||
@@ -1975,3 +1975,22 @@ implode|explode
|
|||||||
map(try implode catch .)
|
map(try implode catch .)
|
||||||
[123,["a"],[nan]]
|
[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"]
|
["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}
|
||||||
Reference in new issue
Block a user