Skip to content

Commit

Permalink
Simple and efficient implementation of walk/1 (#2795)
Browse files Browse the repository at this point in the history
  • Loading branch information
pkoppstein authored Jul 31, 2023
1 parent 0f80921 commit 4d4c17c
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 7 deletions.
15 changes: 8 additions & 7 deletions src/builtin.jq
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand Down
19 changes: 19 additions & 0 deletions tests/jq.test
Original file line number Diff line number Diff line change
Expand Up @@ -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}

0 comments on commit 4d4c17c

Please sign in to comment.