json - jq 递归更新某些元素的值
问题描述
下面的 JSON 数据的目的是用 的所有元素内的值更新字段dst
的值,而不管树内的深度如何,同时保留数据的整个结构。src
type
t
这可能jq
吗?我的几次尝试归结为以下无法达到预期目的的命令:
$ jq -r 'map_values(select(.. | .type? == "t" |= (.dst = .src)))'
{
"a": "b",
"c": [
{
"type": "t",
"src": "xx",
"dst": "zz"
},
{
"type": "t",
"src": "xx",
"dst": "zz"
}
],
"d": [
{
"e": [
{
"type": "t",
"src": "xx",
"dst": "zz"
}
]
},
{
"type": "t2",
"src": "xx",
"dst": "zz"
}
]
}
解决方案
用jq可以吗?
jq 是图灵完备的 :-)
这是一个简单的解决方案:
walk( if type == "object" and .type == "t" then .dst = .src else . end)
如果您的 jq 没有walk/1
,那么可能是升级(到 jq 1.6)的好时机;否则,您可以从网上获取其定义,例如通过谷歌搜索:jq "def walk"
或者 ...
reduce paths as $x (.;
if (getpath($x)|.type? // false) == "t"
then setpath( $x + ["dst"]; getpath( $x + ["src"] ))
else . end)
推荐阅读
- php - 如何从矩形中获取信息并将其发送到 html 中的电子邮件
- javascript - NextJS 映射数组从 Formik 到 Router.Push
- reactjs - 使用 checkCrossOrigin={false} 时如何修复 React-cropper 的错误?
- android - 我无法在我的聊天应用程序中检测到手机上的位置
- python - X_test 中的元组解包
- html - Tailwind CSS 中的不同对齐方式
- arrays - 数组双向链表 - 函数实现
- vb.net - DataGridView 只有空白单元格
- javascript - 如何在 React 中设置活动单选按钮的背景颜色?
- maven - maven 资源插件 - 复制资源