是否可以对记录应用递归转换以返回相同的记录,但是映射了所有string
个值?
例如:
{"x":"1", "a": {"b": 2, "c": ["a"]}, "d": {"e": "z"}}
应用了“添加素数”的映射:
{"x":"1'", "a": {"b": 2, "c": ["a'"]}, "d": {"e": "z'"}}
我尝试使用recurse
,map
,string
和select
的组合运气不佳。有什么想法吗?
答案 0 :(得分:3)
您也可以使用recurse运算符轻松完成此操作:
jq '(.. | strings) += "\'"'
..
通过递归迭代输入的每个元素生成流,strings
过滤流的字符串,+=
将右侧元素添加到每个元素在左侧流中,"\'"
是包含您寻找的“素数”的文字。
答案 1 :(得分:2)
是的,请使用walk/1
。它在jq manual中解释。
如果你的jq没有定义它,那么它的定义来自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;
答案 2 :(得分:0)
以下是使用路径/ 1 标识字符串值并使用 reduce , setpath 和 getpath <更新字符串值的解决方案/强>
reduce paths(type == "string") as $p (
.
; setpath($p; getpath($p) + "'")
)